代码随想录训练营第六天|242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和

今日任务:

242.有效的字母异位词

349.两个数组的交集 

202.快乐数

01.两数之和 


  • 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对象,这部分知识有些模糊了。有需要的可以点击文档查看详细介绍
      • Map 对象是键值对的集合。Map 中的一个键只能出现一次;它在 Map 的集合中是独一无二的。Map 对象按键值对迭代——一个 for...of 循环在每次迭代后会返回一个形式为 [key,value] 的数组。迭代按插入顺序进行,即键值对按 set() 方法首次插入到集合中的顺序(也就是说,当调用 set() 时,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 []
        };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值