ARTS Week 41

Algorithm 本周的算法题为 438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。 实现代码如下: const findAnagrams = function (s, p) { if (p.length > s.length) { return []; } let pCount = new Array(26).fill(0); let sCount = new Array(26).fill(0); let result = []; for (let char of p) { pCount[char.charCodeAt(0) - 'a'.charCodeAt(0)] += 1; } for (let i = 0; i < p.length; i++) { sCount[s.charCodeAt(i) - 'a'.charCodeAt(0)] += 1; } if (isEqual(pCount, sCount)) { result.push(0); } for (let i = p.length; i < s.length; i++) { sCount[s.charCodeAt(i - p.length) - 'a'.charCodeAt(0)] -= 1; sCount[s.charCodeAt(i) - 'a'.charCodeAt(0)] += 1; if (isEqual(pCount, sCount)) { result.push(i - p.length + 1); } } function isEqual(count1, count2) { for (let i = 0; i < 26; i++) { if (count1[i] !== count2[i]) { return false; } } return true; } return result; }; 解题思路: 创建pCount和sCount字母表,通过一个字母的Unicode编码减去字母a的Unicode编码,得到其在字母表中的位置,并且将其计数,通过滑动窗口,左减右加,最后通过对比相同位置计数是否相等,来确定是否是字母异位词。 Review Eye colour change is riskiest cosmetic surgery - Breaking News English Lesson ...

2024-09-30 · 1 分钟 · 199 字

ARTS Week 40

Algorithm 本周的算法题为 189. 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4] 实现代码如下: const rotate = function (nums, k) { let count = 0; if (k <= nums.length) { count = k; } else { count = k % nums.length; } const middlePart = nums.splice(nums.length - count, count); nums.unshift(...middlePart); return nums; } 解题思路: 通过示例1,可以找到规律,元素向右轮转了k个位置,相当于从 nums.length - count 位置截取然后再添加到数组的开头位置。如果k的值等于数组长度,那么,经过向右轮转之后,各元素还是原位。因此,使用 k % nums.length 取余,处理当k大于数组长度的情况。 Review 1Scientists fear people will fall in love with AI voices - Breaking News English Lesson 拥有 ChatGPT 的公司 OpenAI 担心人们可能会在情感上依赖人工智能的声音。该公司上周向用户发布了一种新的“高级语音模式”。聊天机器人配备了一系列栩栩如生的声音,这些声音与人声几乎没有区别。他们可以实时进行真实的对话,在适当的时间大笑,用“嗯”、“啊”和“嗯”插话,他们可以适应被打断。OpenAI 的一份报告指出,新发布的、听起来像人的声音可能会导致人们依赖 AI 来陪伴,甚至浪漫和爱情。它警告说:“用户可能会与 AI 建立社交关系,从而减少他们对人类互动的需求。 OpenAI 报告警告说,未来的聊天机器人可能会从根本上改变社会。它们将重塑我们与家人、朋友和同事的互动方式。他们甚至可能篡夺人类之间的交流。该报告指出了新工具的好处。这些包括给孤独的人带来安慰和友谊,给那些缺乏自信的人信心。报告称,人们可能会获得足够的信心来开始在现实世界中约会。另一方面,聊天机器人可能会导致人们变得更粗鲁、更不耐烦和更自私。Wired.com 写道,新的聊天机器人包括“潜在的……放大社会偏见,传播虚假信息,并帮助开发化学或生物武器”。 Tip 在运行electron-vue项目时,打算把node_modules删除了再重新安装,却提示node_modules/electron文件夹正在被使用,删除失败。然后,把相关窗口都关闭了还是不行,猜测是有关联的进程没有关闭,所以,就看下怎么处理。步骤如下: ...

2024-09-19 · 1 分钟 · 130 字

ARTS Week 39

Algorithm 本周的算法题为 1346. 检查整数及其两倍数是否存在 给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。 更正式地,检查是否存在两个下标 i 和 j 满足: i != j 0 <= i, j < arr.length arr[i] == 2 * arr[j] 示例 1: 输入:arr = [10,2,5,3] 输出:true 解释:N = 10 是 M = 5 的两倍,即 10 = 2 * 5 。 实现代码如下: const checkIfExist = function (arr) { const result = arr.map((m, i) => { const index = arr.indexOf(m * 2) return index != -1 && index != i }) return result.includes(true) }; 解题思路: 把整数数组中的每个整数都乘以2,然后验证其值是否和数组中油相等的存在,如果存在,并且它的下标并不相等(为了排除0*2=0的情况),则证明整数及其两倍数存在。 Review 18-km wide diamond layer on Mercury, says study 美国著名影星玛丽莲·梦露曾唱过一首著名的歌:“钻石是女孩最好的朋友”。比利时列日大学的科学家们相信,他们已经发掘出了数量巨大的这种宝石。在水星的地壳下可能有一个18公里宽的宝石层。离我们最近的行星邻居很可能是天上的一颗宝石。研究人员测试了大约45亿年前水星是如何形成的。这颗行星是从宇宙尘埃和气体云的旋转中演化而来的。经过数百万年的时间,尘埃被压缩成石墨,石墨的化学性质与钻石相同。两者都是碳元素的固体形式。水星上的钻石不太可能被开采出来,因为它们在地表以下约500公里处。 研究人员使用一种被称为砧压机的机器来模拟水星形成的条件。这台印刷机是用来制造人造钻石的。研究人员在石墨胶囊内混合了各种元素。其中包括硅、镁和铝。太空舱承受的压力是地球上的7万倍。它被加热到2000摄氏度的温度。首席研究员推测水星上的钻石。他说:“钻石只由碳构成,所以它们应该与我们在地球上所知道的相似……它们会像纯钻石。”科学家们相信在地球表面下有一千万亿吨钻石。专家表示,这些隐藏的宝石的价值几乎无法估量。 Tip 使用Chrome访问HTTP网站时,因为浏览器自动转为HTTPS导致访问失败,查了下网上的解决方案,如下所示: 在Chrome浏览器地址栏输入chrome://net-internals/#hsts并回车。 找到页面中的Delete domain security policies部分。 输入导致问题的网站域名。 点击Delete按钮删除该域名的安全策略。 Share 前些天,早上过来公司,打开菜鸟教程网站,看了下正则表达式的内容,然后看了“关于我们”一栏,里面有句话说得蛮好的:“我们坚持一件事情,并不是因为这样做了会有效果,而是坚信,这样做是对的。” ...

2024-09-18 · 1 分钟 · 112 字

ARTS Week 38

Algorithm 本周的算法题为 2432. 处理用时最长的那个任务的员工 共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。 给你一个二维整数数组 logs ,其中 logs[i] = [idi, leaveTimei] : idi 是处理第 i 个任务的员工的 id ,且 leaveTimei 是员工完成第 i 个任务的时刻。所有 leaveTimei 的值都是 唯一 的。 注意,第 i 个任务在第 (i - 1) 个任务结束后立即开始,且第 0 个任务从时刻 0 开始。 返回处理用时最长的那个任务的员工的 id 。如果存在两个或多个员工同时满足,则返回几人中 最小 的 id 。 示例 1: 输入:n = 10, logs = [[0,3],[2,5],[0,9],[1,15]] 输出:1 解释: 任务 0 于时刻 0 开始,且在时刻 3 结束,共计 3 个单位时间。 任务 1 于时刻 3 开始,且在时刻 5 结束,共计 2 个单位时间。 任务 2 于时刻 5 开始,且在时刻 9 结束,共计 4 个单位时间。 任务 3 于时刻 9 开始,且在时刻 15 结束,共计 6 个单位时间。 时间最长的任务是任务 3 ,而 id 为 1 的员工是处理此任务的员工,所以返回 1 。 实现代码如下: const hardestWorker = function (n, logs) { let longestDuration = logs[0][1]; let employeeDurationDifferences = [[logs[0][0], logs[0][1]]]; logs.forEach((log, index) => { if (index >= logs.length - 1) { return; } const currentTimeDiff = logs[index + 1][1] - logs[index][1]; employeeDurationDifferences.push([logs[index + 1][0], currentTimeDiff]); longestDuration = Math.max(longestDuration, currentTimeDiff); }); const longestDurationEmployees = employeeDurationDifferences.filter(diff => diff[1] === longestDuration); // 如果只存在一个员工是这个任务时长,则直接返回该员工的ID if (longestDurationEmployees.length == 1) { return longestDurationEmployees[0][0] } let longestDurationEmployeeIds = []; longestDurationEmployees.forEach(record => { longestDurationEmployeeIds.push(record[0]); }); return Math.min(...longestDurationEmployeeIds); } 解题思路: ...

2024-09-13 · 2 分钟 · 216 字

ARTS Week 37

Algorithm 本周的算法题为 1232. 缀点成线 给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 示例 1: 输入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]] 输出:true 实现代码如下: const checkStraightLine = function (coordinates) { // 两点确定一条直线 if (coordinates.length < 2) { return false; } // 同一个X轴 const allEqualX = coordinates.every((item) => item[0] === coordinates[0][0]); if (allEqualX) { return true; } // 同一个Y轴 const allEqualY = coordinates.every((item) => item[1] === coordinates[0][1]); if (allEqualY) { return true; } // 对角线 const [x0, y0] = coordinates[0]; const [x1, y1] = coordinates[1]; // 斜率 const slope = (y1 - y0) / (x1 - x0); // 遍历剩余的坐标点,检查斜率是否一致 for (let i = 2; i < coordinates.length; i++) { const [xi, yi] = coordinates[i]; // 避免除以零,并且使用交叉乘积来比较斜率 if ((yi - y0) * (x1 - x0) !== (y1 - y0) * (xi - x0)) { return false; } } return true; }; 解题思路: 首先,我们明确需求,即判断一组点是否都在同一直线上。这包括三种情况:所有点的X轴坐标相同、所有点的Y轴坐标相同,或者是这些点构成一条斜线。我们可以使用every方法遍历数组中的点,对比它们的X轴或Y轴坐标是否相同。 接下来,对于斜线的判断,我们需要验证这些点的斜率是否一致。如果直接计算斜率 (yi - y0) / (xi - x0) 并与另一个斜率 (y2 - y1) / (x2 - x1) 进行比较,而 x2 - x1 为0时,会遇到除零错误或浮点数精度问题。为了避免这些问题,我们可以使用交叉乘积的方法,即两边同时乘以 (xi - x0) * (x2 - x1),从而得到 (yi - y0) * (x1 - x0) == (y1 - y0) * (xi - x0) 作为斜率是否相等的判断条件。 ...

2024-08-10 · 2 分钟 · 232 字