ARTS Week 25

Algorithm 本周的算法题为 28. 找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystack = "sadbutsad", needle = "sad" 输出:0 解释:"sad" 在下标 0 和 6 处匹配。 第一个匹配项的下标是 0 ,所以返回 0 。 实现代码如下: var strStr = function(haystack, needle) { return haystack.indexOf(needle) }; 解题思路: indexOf() 方法返回数组中第一次出现给定元素的下标,如果不存在则返回-1。这道题目只是这个方法的应用而已,没有太多可以说的。 Review Climate change increases price of Easter eggs - Breaking News English Lesson 今年的复活节彩蛋价格将比去年高得多。原因是气候变化。极端的天气模式使种植可可变得更具挑战性。可可豆用于制作巧克力。全球约70%的可可豆在西非种植。加纳和科特迪瓦最近的高温、干旱和大雨大大减少了可可豆的种植量。温度比正常高四度。路透社称,与去年同期相比,可可价格已翻了一番。能源和气候分析师Amber Sawyer表示,西非农民在面对极端高温和降雨时“感到困难”。 巧克力彩蛋是基督教复活节的礼物,庆祝耶稣的复活。传统上,人们染色和绘制鸡蛋。维基百科称,巧克力彩蛋最早出现在法国路易十四的宫廷,约在1725年。1873年,英国巧克力公司J.S. Fry生产了第一个空心巧克力蛋,类似于今天人们赠送的巧克力蛋。维基百科称:“在西方文化中,赠送巧克力彩蛋现在已经司空见惯,仅在英国就售出了8000万个复活节彩蛋。”然而,气候变化正在使种植可可豆变得更加困难。气候分析师表示,如果我们希望稳定供应可可和巧克力,就需要采取更多措施减少化石燃料排放。 Tip return语句终止函数的执行,并返回一个指定的值给函数调用者。 break语句中止当前循环,switch语句或label语句,并把程序控制流转到紧接着被中止语句后面的语句。中止外层循环,需使用label语句,在外层for循环前加上outer,然后使用break outer实现。 continue声明终止当前循环或标记循环的当前迭代中的语句执行,并在下一次迭代时继续执行循环。 Share 有些习惯一旦断掉,就很难再捡起来了,所以这个ARTS要补很多篇文章,只能先找下当前应对策略,一方面可以有效完成任务,另一方面先易后难,执行起来会顺利一点。事情太多太多了,雨露均沾很难,要有取舍,别到时候啥都没得到。 睡觉,运动,饮食,学习,工作。身体是革命的本钱,任务美好的遐想都基于自身的健康,没有健康,这一切只不过是空中阁楼,不要做陀螺,要做不倒翁。 不要被忙碌的表象迷惑,你所谓的熬夜只是在隔靴挠痒,根本没有,也不想命中要害,要对自己诚实,不要自欺欺人。

2024-04-28 · 1 分钟 · 80 字

ARTS Week 24

Algorithm 本周的算法题为 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:list1 = [1,2,4], list2= [1,3,4] 输出:[1,1,2,3,4,4] 实现代码如下: /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} list1 * @param {ListNode} list2 * @return {ListNode} */ const mergeTwoLists = function(list1, list2) { if (list1 === null) { return list2; } else if (list2 === null) { return list1; } else if (list1.val < list2.val) { list1.next = mergeTwoLists(list1.next, list2); return list1; } else { list2.next = mergeTwoLists(list1, list2.next); return list2; } }; 解题思路: ...

2024-04-23 · 1 分钟 · 152 字

ARTS Week 23

Algorithm 本周的算法题为 1014. 最佳观光组合 给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的 距离 为 j - i。 一对景点(i < j)组成的观光组合的得分为 values[i] + values[j] + i - j ,也就是景点的评分之和 减去 它们两者之间的距离。 返回一对观光景点能取得的最高分。 示例 1: 输入:values = [8,1,5,2,6] 输出:11 解释:i = 0, j = 2, values[i] + values[j] + i - j = 8 + 5 + 0 - 2 = 11 实现代码如下: const maxScoreSightseeingPair = function (values) { let maxValue = 0 let maxPrev = values[0] // 记录前面位置能够得到的最大得分 for (let i = 1; i < values.length; i++) { maxValue = Math.max(maxValue, maxPrev + values[i] - i) // 计算当前位置的得分 maxPrev = Math.max(maxPrev, values[i] + i) // 更新前面位置能够得到的最大得分 } return maxValue } 解题思路: 一开始我以为使用两个for循环然后通过Math.max()比较一下取最大值就解出来,然后提交到力扣后,提示超出时间限制。 为了解决这个问题,可以使用动态规划来优化算法以避免重复计算,通过调整计算公式为values[i] + i + (values[j] - j),可以将当前位置的值加上索引值,再加上下一个位置的值减去索引值,然后取最大值。因此,可以将values[i] + i和values[j] - j分别都取最大值,然后再比较两者的和,从而得到观光景点能取得的最高分。 Review Human speech is 8 times older than we thought - Breaking News English Lesson ...

2024-03-29 · 1 分钟 · 171 字

ARTS Week 22

Algorithm 本周的算法题为 665. 非递减数列 给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。 示例 1: 输入: nums = [4,2,3] 输出: true 解释: 你可以通过把第一个 4 变成 1 来使得它成为一个非递减数列。 示例 2: 输入: nums = [4,2,1] 输出: false 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。 实现代码如下: const checkPossibility = function (nums) { // 如果数组只有一个元素,则直接返回true if (nums.length === 1) { return true } let index = -1 for (let i = 0; i < nums.length; i++) { // 只要有一个不满足的元素,就拿到元素的下标,然后跳出循环。 if (nums[i] > nums[i + 1]) { index = i break } } // 如果出现元素A的下一个值A+1大于等于上一个值A-1,则将A赋值为A+1。 if (index === 0 || nums[index + 1] >= nums[index - 1]) { nums[index] = nums[index + 1] } else { // 否则 nums[index + 1] = nums[index] } // 再次遍历,如果修改某个元素后,不满足 nums[i] <= nums[i + 1],则结果为false for (let i = 0; i < nums.length; i++) { if (nums[i] > nums[i + 1]) { return false } } return true }; 解题思路: ...

2024-03-20 · 1 分钟 · 209 字

ARTS Week 21

Algorithm 本周的算法题为 565. 数组嵌套 索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则。 假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]... 以此类推,不断添加直到S出现重复的元素。 示例 1: 输入: A = [5,4,0,3,1,6,2] 输出: 4 解释: A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2. 其中一种最长的 S[K]: S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0} 实现代码如下: const arrayNesting = function (nums) { // 使用visited数组来记录访问过的元素 let visited = new Array(nums.length).fill(false); function getNumValue(index, nums) { // 设置count,用于记录最大集合长度 let count = 0; // 直到为false,也就是已访问过,出现重复元素,则跳出循环,返回最大集合长度count while (!visited[index]) { visited[index] = true; index = nums[index]; count++; } return count; } let longestSubArray = 0; for (let i = 0; i < nums.length; i++) { // 因为前面如果已经访问过,那么后面再次访问时,获取数组长度值一定是比之前的小的。比如当i=0时,触发了后面i=3的递归遍历,当真的执行到i=3时,又重复进行,所以没有意义。 if (!visited[i]) { let subArrayLength = getNumValue(i, nums); // 每次遍历,比较大小,获取最大值,赋值给到longestSubArray longestSubArray = Math.max(longestSubArray, subArrayLength); } } return longestSubArray; } 解题思路: 我一开始的思路是使用递归,依次将nums各个元素都执行一遍,虽然也解出来了,但是无法满足力扣的解题需求,毕竟是暴力解法,不够优雅。然后使用ChatGPT,让它诊断了下代码,提出特别好的解法,就是上面的代码。最核心的一点就是,使用visited数组来记录访问过的元素,因为如果前面已经访问过,那么后面再次访问时,获取集合长度值一定是比之前的小。比如上面的示例1,当i=0时,其值为5,触发了后面i=5的递归遍历,当真的执行到i=5时,又重复进行,所以没有意义。 Review It once rained for two million years, say scientists 农民在干旱时期祈求降雨。我们大多数人都有过这样的经历,即希望上天为我们的花园降雨以便浇灌植物。然而,我们谁也无法想象一场持续200万年的长时间降雨。英国地质学家和法医科学家阿拉斯泰尔·鲁菲尔发现,在2亿至3亿年前,在盘古大陆分离成大陆之前,地球确实经历了一个长达200万年不间断降雨的时代。鲁菲尔博士说,这有助于促进全球动植物的发展。他认为,降雨可能是由一系列大规模火山喷发后湿度的大幅上升引发的。 鲁费尔博士及其团队是基于在欧洲东阿尔卑斯山脉进行的研究,该研究于20世纪70年代和80年代展开。数据显示,在可追溯到2亿多年前的古老岩石中沉积了不寻常的地层。鲁菲尔说,这导致越来越多的证据表明,雨季可能是“使恐龙和可能是我们现代陆地动物群其他成员多样化并占领陆地”的触发因素。他补充说:“这可能是生命史上最重要的事件之一,因为它不仅在允许恐龙时代的同时,也促成了大多数构成现代动物群的关键类群的起源,包括龟类、鳄鱼、蜥蜴和哺乳动物。” Tip Flutter国内环境配置 ...

2024-03-13 · 1 分钟 · 179 字