代码随想录的第五天

76 阅读2分钟

代码随想录的第五天

242. 有效的字母异位词

var isAnagram = function(s, t) {
    const map = new Map()
    for (let i = 0; i < s.length; i++) {
        if (map.has(s[i])) {
            map.set(s[i], map.get(s[i]) + 1)
        } else {
            map.set(s[i], 1)
        }
    }
    for (let j = 0; j < t.length; j++) {
        if (map.has(t[j])) {
            map.set(t[j], map.get(t[j]) - 1)
            if (map.get(t[j]) === 0) {
                map.delete(t[j])
            }
        } else {
            return false
        }
    }
    return map.size === 0 ? true : false
};

思路:

1、判断整个字符串的字符相同和出现的次数相同即可

2、就是先将其存起来,然后去比对,成功就删除一个,最终存储的哈希表为空则为有效的字母异位词

349. 两个数组的交集

暴力解法
var intersection = function(nums1, nums2) {
    const arr = nums1.filter(item => nums2.includes(item))
    return Array.from(new Set(arr))
};
set解决
var intersection = function(nums1, nums2) {
    if (nums1.length > nums2.length) {
        const temp = nums1
        nums1 = nums2
        nums2 = temp
    }
    let resultNums1 = new Set(nums1)
    let resultArr = new Set()
    for (let i = 0; i< nums2.length; i++) {
        if (resultNums1.has(nums2[i])) {
            resultArr.add(nums2[i])
        }
    }
    return Array.from(resultArr)
};

思路:

1、其实很简单,就是将一个数组存进set表里面,因为set表里面是唯一的

2、然后遍历另外一个数组,如果在set表里面有值则存进set表,最后转换成数组返回

202. 快乐数

map解法
var isHappy = function(n) {
    const map = new Map()

    function getN(n) {
        let sum = 0
        while (n) {
            sum += (n % 10) ** 2
            n = Math.floor(n / 10)
        }
        return sum
    }

    while (true) {
        if (map.has(n)) return false
        if (n === 1) return true
        map.set(n, 1)
        n = getN(n)
    }
};
set解法
var isHappy = function(n) {
    const set = new Set()

    function getN (n) {
        let sum = 0
        while (n) {
            sum += (n % 10) **2
            n = Math.floor(n / 10)
        }
        return sum
    }

    while (true) {
        if (set.has(n)) return false
        if (n === 1) return true
        set.add(n)
        n = getN(n)
    }
};

思路:

1、思路解法一摸一样,主要就是那个快乐数的计算

2、将快乐数每次算的数字都存起来,如果有重复的说明陷入了循环,那么必不可能是快乐数,如果n=1,那么就是快乐数

1. 两数之和

map解法
var twoSum = function(nums, target) {
    const map = new Map()
    for (let i = 0; i < nums.length; i++) {
        map.set(nums[i], i)
    }
    for (let i = 0; i < nums.length; i++) {
        const temp = target - nums[i]
        if (map.has(temp) && map.get(temp) !== i) {
            return [i, map.get(temp)]
        }
    }
};
map优化解法
var twoSum = function(nums, target) {
    const map = new Map()
    for (let i = 0; i < nums.length; i++) {
        const temp = target - nums[i]
        if (map.has(temp)) {
            return [i, map.get(temp)]
        } else {
            map.set(nums[i], i)
        }
    }
};

思路:

就是将数组的值一边进行存储一边进行查询,根据目标值找到另外一个数字,如果存在则返回map里面存储的下标和当前循环的下标,如果不存在则将该数字存进map表中,继续后面的遍历