LeetCode刷题日记之哈希表I

1.有效的字母异位词

题目描述

在这里插入图片描述

解题思路

本题可以采用hash表的思路来解决,单词一共有26个字母,我们可以定义一个长度为26的数组来表示一个hash表,其中每个字母与字母a的ASCII值的来表示26个字母的位置,可以使用两次循环,第一次统计每个字母出现的次数,第二次循环再减去每个字母出现的次数,最后判断是否有字母出现的次数不为0.

var isAnagram = function(s, t) {
   const countArr = new Array(26).fill(0)
   const zero = 'a'.charCodeAt()
   for(let i = 0;i<s.length;i++){
        countArr[s[i].charCodeAt() - zero]++
   }
   for(let i = 0;i<t.length;i++){
       countArr[t[i].charCodeAt() - zero] --
   }


   for(let i = 0;i<countArr.length;i++) {
       if(countArr[i]!==0){ // 一定要判断不等于0 之前判断小于0 会漏掉t字符串比s字符串长的情况
           return false
       }
   }

   return true
};

2.两个数组的交集

题目描述

在这里插入图片描述

解题思路

本题使用hash表,第一次循环统计第一个数组中每个数字出现的次数,第二次循环判断每个数字是否在hash表中出现过,出现过则将这个数字放入最终结果数组中,需要注意的是最终结果需要去重。

var intersection = function(nums1, nums2) {
  let set = new Set(nums1)
    let res = []
    for(let i = 0;i<nums2.length;i++){
        if(set.has(nums2[i])){
            res.push(nums2[i])
        }
    }
    return [...new Set(res)]
};

3.快乐数

题目描述

在这里插入图片描述

解题思路

本题难点是求各个位数上的平方和,剩下的就是判断sum是否在hash表中出现过,出现过则表示会无限循环可以直接return false,如果和为1则return true。

var isHappy = function(n) {
  let set = new Set() // 本题只需要存值即可 所以使用Set数据集
  while(1) {
      let sum = getSum(n)
      if(set.has(sum)) {
          return false
      } else if(sum == 1) {
          return true
      } else {
          set.add(sum)
      }
      n = sum
  }
};
var getSum = function(n) {
    let sum = 0;
    while(n) {
        sum += (n%10)**2 // n % 2 求末位数
        n = Math.floor(n/10); // n/10 整除
    }
    return sum
}

4.两数之和

题目描述

在这里插入图片描述

解题思路

本题使用hash表比较简单,我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。
那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。

var twoSum = function(nums, target) {
  let map = new Map()
  for(let i = 0;i<nums.length;i++){
      if(map.has(target -nums[i])) {
          return [i,map.get(target-nums[i])]
      } else {
          map.set(nums[i],i)
      }
  }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值