代码随想录- day6 哈希表部分(上)

121 阅读3分钟

242.有效的字母异位词

力扣题目链接

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram" 
输出: true

示例 2:

输入: s = "rat", t = "car" 
输出: false

说明:  你可以假设字符串只包含小写字母。

解题思路

首先建立一个长度为26的数组,对应 a-z 字母,遍历字符串s,在数组中记录每个字母出现的个数。

接下来遍历字符串t,遍历时对字母对应数组的值做-1操作。

如果s 和 t 是异位字符串,那么经过操作后,数组的所有元素应该都是0. 遍历数组,如果数组元素皆为0,返回 true,否则返回 false.

var isAnagram = function(s, t) {
    if(s.length !== t.length){
        return false
    }
    let table = Array(26).fill(0)
    for(let char of s){
        table[char.charCodeAt('')-97] ++
    }
    for(let char of t){
        table[char.charCodeAt('')-97] --
    }
    if(table.every(item => item===0)){
        return true
    }else{
        return false
    }
};

349. 两个数组的交集

力扣题目链接

题意:给定两个数组,编写一个函数来计算它们的交集。

image.png

解题思路

  1. 将 nums1 和 nums2 中的所有元素放入一个容器arr内,依次遍历arr 中的元素,并判断该元素是否同时属于两个数组。如果是,将该元素push 进结果数组。
var intersection = function(nums1, nums2) {
    let res = new Set()

    let arr = [...nums1,...nums2]
    for(let num of arr){
        if(nums1.includes(num)&&nums2.includes(num)){
        res.add(num)
        }
    }

    return [...res]
};
  1. 遍历nums1,将去重的结果为set1;创建结果res,接着遍历nums2,如果在nums2中遇到 set1 中的元素,且元素不在res 中,将该元素添加到结果中。
var intersection = function(nums1, nums2) {
    let res = new Set()
    let set1 = new Set(nums1)

    for(let num of nums2){
        if( set1.has(num) && !res.has(num)){
            res.add(num)
        }
    }
    return [...res]
};

202. 快乐数

力扣题目链接

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

解题思路

这道题,在数字不断将自己替换为它每个数字上的平方和时,只有两种结果: 变为1 ,不停地循环。也就是说,我们记录下这个数字替换变化的过程history, 如果数字最终变为1,那么返回TRUE, 如果数字经过若干次变化后成为了history中的某个数字,那么它未来也将陷入此前history中记载的循环,返回false。

var isHappy = function(n) {
    let history = []
    while(n!==1){
        let arr = n.toString().split('').map( item => +item * +item)
        let sum = arr.reduce((pre,cur)=> pre+= cur,0)
        if(history.includes(sum)){
            return false
        }
        n = sum
        history.push(sum)
    }
    return true
};

1. 两数之和

力扣题目链接(opens new window)

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

解题思路

  1. 传统方法,双指针

  2. 一边遍历数组,一边使用map存储其值和对应的索引,计算当前值和目标值的差值,然后在map中查找,找到就返回两个索引值。

var twoSum = function(nums, target) {
    let map = new Map()
    for(let i=0;i<nums.length;i++){
        let diff = target - nums[i]
        if(map.has(diff)){
            return [i,map.get(diff)]
        }
        map.set(nums[i],i)
    }
};