今日任务:
- 242.有效的字母异位词
- 拿到题后,先无脑地暴力写了一遍
-
var isAnagram = function(s, t) { let dicStor = {} for(const i of s){ if(dicStor[i]){ dicStor[i] +=1 }else{ dicStor[i] = 1 } } for(const j of t){ if(dicStor[j]){ dicStor[j] -=1 }else{ return false } } for(var i = 0; i < Object.values(dicStor).length; i ++){ if(Object.values(dicStor)[i] !== 0){ return false } } return true };
- 随后冷静思考了一下,觉得写的简直是太罗嗦了,就着手简化一下代码。先判断两个字符串的长度是否一致,不一致就直接false掉,如果一直在接着判断。既然长度已经一致了,那么最后一个for循环判断就是多余的,直接删除完全没问题
-
var isAnagram = function(s, t) { let dicStor = {} if(s.length !== t.length) return false for(const i of s){ if(dicStor[i]){ dicStor[i] +=1 }else{ dicStor[i] = 1 } } for(const j of t){ if(dicStor[j]){ dicStor[j] -=1 }else{ return false } } return true };
- 暴力通过后,看了代码随想录题解|242.有效的字母异位词里面提供了两种写法,其中第二种写法,让自己复习了一下JS中的Map对象,这部分知识有些模糊了。有需要的可以点击文档查看详细介绍
- 349.两个数组的交集
- 看了题目要求后,觉得和上一道题的思路一样,就直接延续上一题的思路,自己先写了一遍
-
var intersection = function(nums1, nums2) { let dicStor = {} let char_count = new Set(); for(const i of nums1){ if(dicStor[i]){ dicStor[i] +=1 }else{ dicStor[i] = 1 } } for(const j of nums2){ if(dicStor[j]){ char_count.add(j) } } return [...char_count] };
- 其实第一遍提交的时候没有通过,是因为最后返回交集的结果的时候直接是return char_count,题目中要求返回的还是数组类型,所以看了一下代码随想录题解|349.两个数组的交集,最后返回的时候用的是ES6语法,扩展运算符,这个知识点自己虽然知道,但是真正用的时候还是想不起来用。注意在数组或函数参数中使用扩展运算符时,只能用于 可迭代对象
- 随想录给的解法,使用的是Array.from()将Set转换为Array
-
var intersection = function(nums1, nums2) { // 根据数组大小交换操作的数组 if(nums1.length < nums2.length) { const _ = nums1; nums1 = nums2; nums2 = _; } const nums1Set = new Set(nums1); const resSet = new Set(); // for(const n of nums2) { // nums1Set.has(n) && resSet.add(n); // } // 循环 比 迭代器快 for(let i = nums2.length - 1; i >= 0; i--) { nums1Set.has(nums2[i]) && resSet.add(nums2[i]); } return Array.from(resSet); };
- 202.快乐数
- 拿到题以后,先想了想自己会什么?会去求个位数、十位数和百位数等,但是又想到这样求和得到的数不会一直无限大下去嘛?隐约觉得还是把题目再理解一下吧,然后看了代码随想录题解|202.快乐数思路解析,里面提到“无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要”,说实话,看到这句话并没有豁然开朗的感觉,还是不理解,就又去搜索了别的资料来自知乎的一篇文章,它里面提到“不快乐数的数位平方和计算,最后都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环体。”,看到这里,才反应过来什么叫“无限循环”,所谓的循环,循环的是什么!
- 也就是对于快乐数来说,无限循环的是1,对于非快乐数来说,无限循环的是sum中出现过的值。
- 个人更倾向于用快慢指针来解这道题
- 1.两数之和
- 一开始没有想到要和哈希表产生什么联系。就直接看了代码随想录题解视频|01.两数之和详细解释了:
- 为什么使用哈希表?因为遍历到一个数时,要去之前遍历过的地方查找有没有出现过需要的值,哈希表就是用来存放之前遍历过的值
- 为什么使用map映射?因为最后需要返回的是下标值,所以存放的时候需要把当前的值和下标值都存放进去,数值作为key,下标作为value
-
var twoSum = function(nums, target) { let mapList = {} for(var i = 0; i < nums.length; i ++){ // 需要的值之前遍历过 if(mapList[target - nums[i]] !== undefined){ return [i, mapList[target - nums[i]]] } // 如果需要的值之前没有遍历过,把当前的值保存下来 mapList[nums[i]] = i } return [] };
- 一开始没有想到要和哈希表产生什么联系。就直接看了代码随想录题解视频|01.两数之和详细解释了: