ARTS Week 49

Algorithm 实现代码如下: 解题思路: Review Tip Share 一文读懂:PMF(product market fit)与产品管理 “一些初创企业,花很多的时间专注于他的新技术、新功能、新创意,不做用户访谈,花极少的时间验证市场需求、用户付费意愿,最后用一个产品去解决一个不存在的问题或者市场,拿着锤子找钉子,这样的结果大概率也是失败的。”

2025-03-28 · 1 分钟 · 10 字

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 字