ARTS Week 3

Algorithm 本周的算法题为 128. 最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。 实现代码如下: var longestConsecutive = function (nums) { // 如果数组为空,则值为0,否则最小为1 let sequenceMaxValue = nums.length == 0 ? 0 : 1 let category = {} // 去重,使用对象key唯一性的特性实现数组去重。 nums.forEach(item => { if (category[item]) { category[item].push(item) } else { category[item] = [item] } }) let result = [] // 获取最终的去重后的数组 for (const key in category) { if (Object.hasOwnProperty.call(category, key)) { result.push(Number(key)) } } // 将数组排序,从小到大排序 result.sort((x, y) => { return x - y }) // 设置顺序起点为数组下标为0的位置 let latestStartIndex = 0 // 设置顺序起点值,下标为0的值 let latestStartValue = result[0] // 用来记录每个顺序,以起点为key,总共有多少次。 let sequenceCountObject = {} result.forEach((item, index) => { // 因为设置了latestStartValue = result[0],默认会走else逻辑,sequenceCountObject[0]会多一次。 if (index > 0) { // 实现的逻辑是,比如数组为[1,2,3,4,5,8,9,10],当后一个数,减去它的下标等于当前值latestStartValue(4-3=1),意味着还是处于顺序中,如果不是,比如到8了,那就开始新的顺序起点。 // 其中,因为第一个起点数,不是每次都是下标0开始的,所以不能只是item - latestStartIndex,而是item - (index - latestStartIndex)拿到差值。 if (item - (index - latestStartIndex) !== latestStartValue) { latestStartIndex = index latestStartValue = result[index] } else { // 如果当前值减去下标差值一直等于顺序起点值,意味着还处于顺序中,就加到对象这个以每个起点下标为key的值上,+1。 if (sequenceCountObject[latestStartIndex]) { sequenceCountObject[latestStartIndex] = sequenceCountObject[latestStartIndex] + 1 } else { //当对象中还没有存在这个起点下标的key时,默认从1开始,因为当latestStartIndex开始新的起点的时候,是走上面的if逻辑的,意味着这里要把起点的次数算上,所以是1+1,第一个1是起点,第二个1是记录次数 sequenceCountObject[latestStartIndex] = 1 + 1 } } } }) // 获取多个顺序长度的最大值,如果比当前值大,则赋值最新。 for (const key in sequenceCountObject) { if (Object.hasOwnProperty.call(sequenceCountObject, key)) { const value = sequenceCountObject[key] if (value > sequenceMaxValue) { sequenceMaxValue = value } } } return sequenceMaxValue 解题思路: ...

2023-11-08 · 2 分钟 · 247 字

ARTS Week 2

Algorithm 本周的算法题为 49. 字母异位词分组 - 力扣(LeetCode) 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 实现代码如下所示: let strs = ["eat", "tea", "tan", "ate", "nat", "bat"] var groupAnagrams = function (strs) { let sortedStrs = [] strs.forEach(str => { let sortedStr = str.split("").sort().join(""); sortedStrs.push(sortedStr) }) let categories = {} sortedStrs.forEach((str, index) => { if (categories[str]) { categories[str].push(strs[index]) } else { categories[str] = [strs[index]] } }) let result = [] for (const key in categories) { result.push(categories[key]) } return result } groupAnagrams(strs) 解题思路: 通过查看示例1的输出数组得知,相同字母但顺序可以不一样,所以我们可以考虑,将各元素重新排序,那么就可以知道哪些元素是相同的。首先,先遍历 strs 数组,使用 split("") 将字符串str分割为字符数组,然后使用 sort() 对字符数组进行排序,最后使用 join("") 将排序后的字符数组拼接为字符串。 sortedStrs 其值如下: [ 'aet', 'aet', 'ant', 'aet', 'ant', 'abt' ] 然后开始将 sortedStrs 中的元素进行分类,将相同元素归入同一个数组中,使用对象key的唯一性进行实现,遍历 sortedStrs ,将元素作为对象 categories 的key值,如果key没有存在,则生成新的key,并将元素自身添加至value数组中,如果已存在,则将元素添加至value数组中。在以下代码中,如果 sortedStrs 中有相同的元素,则加入到 categories[str] 数组中,但是因为 sortedStrs 是排序后的数据,虽然元素被排序了,但是下标 index 是不变的,所以就 push 原数组 strs 相同下标的元素。因为如下所示: ...

2023-10-29 · 1 分钟 · 209 字

ARTS Week 1

Algorithm 本周的算法题为 1. 两数之和 - 力扣(LeetCode) 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 实现代码如下所示: let nums = [2, 7, 11, 15], target = 9 var twoSum = function (nums, target) { let output = [] nums.forEach((item, i) => { nums.forEach((data, j) => { if (i !== j) { if (item + data === target) { output.push(i) output.push(j) } } }) }) output = Array.from(new Set(output)) return output }; twoSum(nums, target) 解题思路是,遍历两次 nums 数据,然后将 nums[i] 和 nums[j] 相加,如果其值等于 target ,则添加到 output 数组中,以示例1的数据举例,因为遍历两次,会出现 [0,1] 和 [1,0] 的情况,所以需要对数组去重,数组去重使用 Array.from(new Set(output)) 实现。至此,是可以实现示例1的需求了,但是如果是示例2时,就会出问题。 ...

2023-10-22 · 2 分钟 · 258 字

关于ARTS

ARTS 是陈皓在课程《左耳听风》中提出的原创概念,以周为单位,循环反复的学习活动。 Algorithm: 在 LeetCode 上做一道算法题,这一步主要是为了编程的训练和学习,如果不训练,看再多的书籍也是没有用的。 Review: 读一篇英文文章,主要是为了训练英文,英文能力不行,无法成为技术高手。 Tips: 分享一个小技术,可以总结和归纳日常生活中的知识点。 Share: 分享一个观点,为了让你建立影响力,能够输出价值观。

2023-10-08 · 1 分钟 · 12 字