ARTS Week 4

Algorithm 本周的算法题为 283. 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0] 实现代码如下: var moveZeroes = function(nums) { // 记录数组中存在0的个数 let count = 0 // 使用递归的方式,遍历删除数组中的0,并且记录数组中出现0的次数。 deleteZeroes(nums) function deleteZeroes(nums) { for (let i = 0; i < nums.length; i++) { if (nums[i] == 0) { nums.splice(i, 1) count++ return deleteZeroes(nums) } } return nums } // 根据数组中出现0的次数,将删除全部0后的数据,在尾部添加count次0元素。 for (let i = 0; i < count; i++) { nums.push(0) } return nums }; 解题思路: 首先,先找到数组中0的位置,然后依次将其从数组中删除,并记录出现0的次数。 根据0出现的次数,在数据尾部加上0。 Review Your Life Is Built By What You Do After Your Work Hours | by Anjishnu Ray | Medium 你的工作会给你的人生带来价值,但不会很多,特别是你还很年轻的时候,你的人生是由你下班后的空闲时间决定的。 我们通常工作6~8个小时,除去睡觉的时间,仍然还有8个小时的空闲时间。这些时间足够让你用来创造更有可能性的未来。 成功人士总是会选择艰难的道路,首先你要在脑海中想象自己就是一位成功人士,然后在现实中,也这样认为。在这些下班后的空闲时间里,你是选择去Netflix网站看电影,还是用来打磨你的技能,你是得过且过,还是为你的将来制定周详的计划?成功人士总是选择艰难的道路,因为尽管很困难,但它是有价值的。 成功人士总是优先考虑成就而不是舒适度。这是他们的生活方式。他们每天如此,最终使他成为现实中的成功人士。 当你工作的时候,你就是在工作,你是在成长,在进步,在完成项目,这没有错。但是你是否想过利用你的空闲时间来打磨你的技能,实验和尝试新的事物?如果这些努力给你带来好处,你会后悔吗?肯定不会,但是如果你浪费你的空闲时间在肤浅的事情和盲目的娱乐上,肯定会让你后悔。不是说现在,而是在未来的某个时刻。 休息能够恢复你的精力,放松能让你感到舒适。我们是人,当然需要休息,我们需要恢复精力和适当放松。这些都是必需品。但是安逸?我们为什么觉得安逸是一个必需品呢?它不是必需的,不应该成为一个必选项。 就像那些成功人士说的那样,最好的潜力往往能在人们的坟墓中找到。这是因为直到他们死去,他们都没有在梦想中投入足够的努力和精力。 青春是用来燃烧的,而不是用来消磨的。把这句话印到你的脑海之中吧。 当人们老去之时,唯一的希望就是还能够拥有更多的时间。不,这不可能。当你变老之时,你是为自己的一生感到自豪,还是后悔不已呢? 你不会活上一千年。 ...

2023-11-12 · 1 分钟 · 129 字

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

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

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