ARTS Week 49

Algorithm 本周的算法题为 3280. 将日期转换为二进制表示 给你一个字符串 date,它的格式为 yyyy-mm-dd,表示一个公历日期。 date 可以重写为二进制表示,只需要将年、月、日分别转换为对应的二进制表示(不带前导零)并遵循 year-month-day 的格式。 返回 date 的 二进制 表示。 示例 1: 输入: date = "2080-02-29" 输出: "100000100000-10-11101" 解释: 100000100000, 10 和 11101 分别是 2080, 02 和 29 的二进制表示。 实现代码如下: const convertDateToBinary = function(date) { const [year, month, day] = date.split('-') const yearBinary = parseInt(year).toString(2) const monthBinary = parseInt(month).toString(2) const dayBinary = parseInt(day).toString(2) return `${yearBinary}-${monthBinary}-${dayBinary}` }; 解题思路: 将日期格式的字符串拆分为年、月、日三个部分。 利用 Number.prototype.toString() 方法中基数的特性,将数字转换为二进制字符串。 Review Scientists discover new water purification microbes - Breaking News English Lesson 科学家们在我们脚下的地球中发现了一种以前未知的微生物。密歇根州立大学的研究人员一直在探索地球表面下方和上方的一个区域,称为临界区。这个区域对于提供维持生命的条件至关重要。研究人员将这些微生物称为 CSP1-3。微生物可能是净化水过程的关键部分。微生物学家 James Tiedje 说,虽然土壤层负责雨水的大部分过滤,但 CSP1-3 也是必不可少的。他说:“CSP1-3 是清理土壤表层的清道夫。他们的工作是净化我们的饮用水。 Tiedje 博士和他的团队专注于生活在我们脚下 200 米深处土壤中的微生物。他说,CSP1-3 微生物可以去除供水中的有害污染物和碎屑。他现在想在他的实验室中培养 CSP1-3,以了解更多关于它们的特性。他认为它们可以用来清理土壤中的污染。他说:“我们不知道它们代谢顽固污染物的能力,如果我们能了解这一点,我们就可以帮助解决地球上最紧迫的问题之一。scitechdaily.com 网站称:“了解这个新发现的群体可以促进保护工作并帮助应对气候变化。 Tip 在平时写邮件和使用 typora 软件写日记的时候,特别苦恼怎么能快速插入日期,比如写日记,每次都要复制昨天的日记文档,然后修改时间,很是繁琐,所以就研究了一下,结果发现使用搜狗输入法就很快实现了。 使用搜狗输入法,在中文模式下,输入 rq ,则会自动显示日期格式 年月日 ,如下所示: ...

2025-04-23 · 1 分钟 · 112 字

ARTS Week 48

Algorithm 本周的算法题为 2351. 第一个出现两次的字母 给你一个由小写英文字母组成的字符串 s ,请你找出并返回第一个出现 两次 的字母。 注意: 如果 a 的 第二次 出现比 b 的 第二次 出现在字符串中的位置更靠前,则认为字母 a 在字母 b 之前出现两次。 s 包含至少一个出现两次的字母。 示例 1: 输入:s = "abccbaacz" 输出:"c" 解释: 字母 'a' 在下标 0 、5 和 6 处出现。 字母 'b' 在下标 1 和 4 处出现。 字母 'c' 在下标 2 、3 和 7 处出现。 字母 'z' 在下标 8 处出现。 字母 'c' 是第一个出现两次的字母,因为在所有字母中,'c' 第二次出现的下标是最小的。 实现代码如下: const repeatedCharacter = function (str) { let earliestRepeatIndex = Infinity; for (let i = 0; i < str.length; i++) { // 如果出现了第一次和最后一次的位置不相等,则表示有2个以上存在 if (str.indexOf(str[i]) !== str.lastIndexOf(str[i])) { // 第一个出现两次的字母,则关键点就在第二次出现的位置,谁最靠前(indexOf越小),那么该位置的字母就是所求的值。 const secondOccurrenceIndex = str.indexOf(str[i], str.indexOf(str[i]) + 1); earliestRepeatIndex = Math.min(earliestRepeatIndex, secondOccurrenceIndex); } } return str[earliestRepeatIndex]; } 解题思路: 如果出现了第一次和最后一次的位置不相等,则表示有2个以上存在 第一个出现两次的字母,则关键点就在第二次出现的位置,谁最靠前(indexOf越小),那么该位置的字母就是所求的值。 Review Fog harvesting could provide water for dry cities - Breaking News English Lesson 全球许多地区降雨稀少,人们每日获取饮用水都面临巨大挑战。科学家发现了一项可能帮助世界最干旱城镇的新技术——从雾中收集水分,这项技术有望为数百万人口提供饮用水。智利研究人员正在探索"捕雾取水"技术的应用潜力。这项技术原理简单:在立柱之间悬挂巨型网状幕帘,当云雾穿行其间,水滴附着在网格表面,最终汇聚成水流通过下方管道导入储水罐。这种低成本、易操作的集水方式为干旱地区提供了新选择。 来自首都圣地亚哥私立大学马约尔大学的研究团队,在年均降雨量不足5毫米的沙漠小镇阿尔托奥斯特西奥开展实地测试。当地居民日常饮用水主要依赖卡车运输。研究负责人弗吉尼亚·卡特·甘贝里尼博士指出,这项技术将开启"新时代",其研究"标志着雾水资源利用认知的重大转变——从局限于农村地区的小型解决方案,升级为适用于城市的实用水源"。她补充道:“云雾中的水资源既能提升城市应对气候变化的能力,又能改善清洁水源的获取条件。” Tip 在 Windows 中,端口被占用,怎么解决? ...

2025-03-08 · 1 分钟 · 158 字

ARTS Week 47

Algorithm 本周的算法题为 1566. 重复至少 K 次且长度为 M 的模式 给你一个正整数数组arr,请你找出一个长度为m且在数组中至少重复k次的模式。 模式是由一个或多个值组成的子数组(连续的子序列),连续重复多次但不重叠。模式由其长度和重复次数定义。 如果数组中存在至少重复k次且长度为m的模式,则返回true,否则返回false。 示例 1: 输入:arr = [1,2,4,4,4,4], m = 1, k = 3 输出:true 解释:模式 (4) 的长度为 1 ,且连续重复 4 次。注意,模式可以重复 k 次或更多次,但不能少于 k 次。 实现代码如下: const containsPattern = function(arr, m, k) { const n = arr.length; if (n < m * k) return false; for (let i = 0; i <= n - m * k; i++) { let valid = true; for (let j = 1; j < k; j++) { for (let pos = 0; pos < m; pos++) { const currentPos = i + j * m + pos; const patternPos = i + pos; if (arr[currentPos] !== arr[patternPos]) { valid = false; break; } } if (!valid) break; } if (valid) return true; } return false; }; 解题思路: 首先检查数组的长度是否至少为 m * k。如果不足,则直接返回 false。 遍历所有可能的模式起始位置 i,确保这些位置可以容纳至少 k 个连续的模式(即 i 的范围是 0 到 arr.length - m * k)。 对于每个起始位置 i,检查从该位置开始的连续 k 个模式的元素是否完全一致。直接通过数组索引比较元素。 Review New Zealand relaxes visa rules for ‘digital nomads’ - Breaking News English Lesson ...

2025-02-08 · 1 分钟 · 181 字

ARTS Week 46

Algorithm 本周的算法题为 1156. 单字符重复子串的最大长度 如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。 给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。 示例 1: 输入:text = "ababa" 输出:3 实现代码如下: const maxRepOpt1 = function (text) { const count = {}; for (const char of text) { if (!count[char]) { count[char] = 0; } count[char]++; } let max_length = 0; const n = text.length; for (let i = 0; i < n; i++) { const char = text[i]; let length = 1; let j = i + 1; while (j < n && text[j] === char) { length++; j++; } if (length < count[char]) { if (j < n && text[j] !== char && j + 1 < n && text[j + 1] === char) { let k = j + 1; while (k < n && text[k] === char) { length++; k++; } if (length < count[char]) { length++; } } else { length++; } } max_length = Math.max(max_length, length); } return max_length; } 解题思路: 使用一个对象 count 来统计每个字符的出现次数。遍历字符串,将每个字符的出现次数记录在 count 中。 使用一个外层循环,从每个字符开始,向右扩展,找到当前字符的最长连续重复子串。 如果当前子串长度小于该字符的总出现次数,尝试检查子串两端是否有相同字符,或者中间是否有不同字符可以交换。 每次找到一个更长的子串时,更新 max_length。 Review Lunar New Year sees record migration in China - Breaking News English Lesson ...

2025-02-07 · 1 分钟 · 202 字

ARTS Week 45

Algorithm 本周的算法题为 1475. 商品折扣后的最终价格 给你一个数组 prices ,其中 prices[i] 是商店里第 i 件商品的价格。 商店里正在进行促销活动,如果你要买第 i 件商品,那么你可以得到与 prices[j] 相等的折扣,其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ,如果没有满足条件的 j ,你将没有任何折扣。 请你返回一个数组,数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。 示例 1: 输入:prices = [8,4,6,2,3] 输出:[4,2,4,2,3] 解释: 商品 0 的价格为 price[0]=8 ,你将得到 prices[1]=4 的折扣,所以最终价格为 8 - 4 = 4 。 商品 1 的价格为 price[1]=4 ,你将得到 prices[3]=2 的折扣,所以最终价格为 4 - 2 = 2 。 商品 2 的价格为 price[2]=6 ,你将得到 prices[3]=2 的折扣,所以最终价格为 6 - 2 = 4 。 商品 3 和 4 都没有折扣。 实现代码如下: const finalPrices = function (prices) { let priceDifferences = [] prices.forEach((currentPrice, currentIndex) => { let lowerPriceIndexes = [] let priceDifference = 0 prices.forEach((comparePrice, compareIndex) => { if (compareIndex > currentIndex && comparePrice <= currentPrice) { lowerPriceIndexes.push(compareIndex); } }) if (lowerPriceIndexes.length === 0) { priceDifference = currentPrice } else { let minIndex = Math.min(...lowerPriceIndexes) priceDifference = currentPrice - prices[minIndex] } priceDifferences.push(priceDifference) }) return priceDifferences } 解题思路: 先遍历查询满足条件的下标,然后获取最小下标。 如果没有符合条件的折扣,则使用当前价格。 Review Mystery drones in USA causing alarm - Breaking News English Lesson ...

2025-01-01 · 1 分钟 · 175 字