代码随想录Day5打卡 哈希表(1)

43 阅读1分钟

242 有效的字母异位词

这道题可以使用一个哈希表来记录第一个词的字母和出现的频率,再遍历第二个词,对每一个第二个词里的字母在哈希表中的频率-1,如果发现有一个字母并没有出现在哈希表中,证明第二个词中有第一个词里没有的字母,返回false。最后检查哈希表的大小,如果大小为0,返回true

var isAnagram = function(s, t) {
    const map = new Map()
    for (const c of s) {
        if (!map.has(c)) {
            map.set(c, 0)
        }
        map.set(c, map.get(c) + 1)
    }
    for (const c of t) {
        if (!map.has(c)) {
            return false
        }
        map.set(c, map.get(c) - 1)
        if (map.get(c) === 0) {
            map.delete(c)
        }
    }
    if (map.size > 0) return false
    return true
};

349 两个数组的交集

因为题目说到输出的每个元素应该都是唯一的,所以我们先对s1和s2用set去重,然后求他们的交集

var intersection = function(nums1, nums2) {
    const res = []
    const s1 = new Set(nums1)
    const s2 = new Set(nums2)
    s1.forEach((v) => {
        if (s2.has(v)) {
            res.push(v)
        }
    })
    return res
};

202 快乐数

使用快慢指针的技巧可以巧妙的解决,因为如果有重复,其实就是出现了环。

var isHappy = function(n) {
    let slow = n
    let fast = n
    do {
        slow = calculate(slow)
        fast = calculate(calculate(fast))
        // 终止条件:有环,快慢指针相遇。无环,快指针到1
    } while (slow !== fast && fast !== 1) 
    if (fast === 1) {
        return true
    }
    return false
};

const calculate = (num) => {
    let res = 0
    while (num > 0) {
        const digit = num % 10
        res += digit * digit
        num = Math.floor(num/10)
    }
    return res
}