算法-代码随想录之 哈希 242.有效的字母异位词 ,349. 两个数组的交集 , 1. 两数之和

44 阅读1分钟

242.有效的字母异位词

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

image.png

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    if(s.length !== t.length) return false // 如果字符长度不相等,就不是异位词
    let resSet = new Array(26).fill(0) // 创建26个英文字母长度的数组
    const base = 'a'.charCodeAt() // 以字母a的Unicode编码为基础
    for(let i = 0; i < s.length; i++) {
        resSet[s.charCodeAt(i) - base]++ // resSet数组中每一个字母的位置根据s的字符串而内容增加
        resSet[t.charCodeAt(i) - base]-- // 根据t的字符串内容--
        // [1,0,0,0,0...0] 1 代表有1个字母a
    }
    // 所以循环完毕后,如果是异位词,则每一项都应该是0,否则就不是异位词
    return resSet.every(i => i===0 )
};

中间循环加减地方对我来说有些不太好理解,只能这么描述了,希望大家有更好的看法来补充。

349. 两个数组的交集

image.png

这个要使用set去重,循环更长的那个数组,判断另一个的item是否在当前数组中,注意Array.from()将set转化为真正的数组

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
     if(nums1.length < nums2.length) {
         let _ = nums2
         nums2 = nums1
         nums1 = _
     }
    const nums1Set = new Set(nums1)
    return Array.from(new Set(nums1.filter(i => nums2.includes(i))))
    
    
    // for(let i = nums2.length - 1; i >= 0; i--) {
    //     nums1Set.has(nums2[i]) && resSet.add(nums2[i]);
    // }
    // return Array.from(resSet)
};
  1. 快乐数,还没总结好,继续加油

1. 两数之和

经典的两数之和来了。。

image.png

查找一个元素是否在某个集合中,或者是否出现过,使用map更合适,匹配的括号那个题目也应该是使用map

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let numMap = new Map()
    for(let i = 0; i < nums.length;i++) {
        const res = target - nums[i] // target - 当前元素
        if(numMap.has(res)) {
            return [numMap.get(res), i] // 如果map中有这个差,就把存在map中差对应的index 和当前元素的index返回
        } else {
            numMap.set(nums[i], i) // 如果map中没有,就把当前元素的值和index都存起来,map的key是值,value是index
        }
    }
};

代码参照代码随想录