leetcode 刷题记录 day6(哈希表部分)

  • hash 表理论基础( js ):
    ECMAScript 6 Set和Map数据结构
  • 242.有效的字母异位词
    思路】排除暴力解法,要想减少循环,就要重新设定一个数组,记录字符串中每个字母出现的次数,关键是怎么表示新数组里出现的字母从而减少对新数组的遍历,我们挨个存放字符串中出现的字母,等到查找是否出现过时,就得每查找一次遍历一遍,这时最简便的做法就是利用 ASCII 码值,按 26 个字母的顺序存放,就可以直接查找我们想要的字母的个数。第一遍循环遍历 s 字符串中的字母并记录个数,第二遍循环遍历 t 字符串字母,如果此时数组中该字母的值为 0,就证明个数不想等,返回 false。反之,数组中该字母的个数 -1,继续遍历。
    var isAnagram = function(s, t) {
      if (s.length !== t.length) return false;
    
      let resArr = new Array(26).fill(0);
      let base = "a".charCodeAt();
    
      for (let i of s) {
        resArr[i.charCodeAt() - base]++;
      }
    
      for (let i of t) {
        if (!resArr[i.charCodeAt() - base]) return false;  // 如果 s 字符串中第 i 个字母的个数为 0(resArr[i] = 0),就返回 false
        resArr[i.charCodeAt() - base]--;
      }
      return true;
    };
    
  • 349. 两个数组的交集
    思路】利用 Set 数据结构的 filter 和 has 函数可以求交集。
    var intersection = function(nums1, nums2) {
      let newNums1 = new Set(nums1);
      let intersect = [...newNums1].filter(val => new Set(nums2).has(val));
     
      return intersect;
    };
    
  • 202. 快乐数
    解法】还有几种解法,有空补充,先欠着!
var isHappy = function (n) {
    let m = new Set();
    const getSum = () => {
      let sum = 0;
      while (n){
        sum += (n % 10) ** 2;
        n = Math.floor(n / 10);
      }
      return sum;
    }

    while (true) {
      // n 重复出现证明进入循环,不会变为 1
      if (m.has(n)) return false;
      if (n === 1) return true;
      m.add(n); // 记录 n 的值
      n = getSum(n);
    }
}
  • 1. 两数之和
    思路】求两数之和,要把数组中遍历过的元素存在 hash 对象中,判断target - nums[i] 的值是否在 hash 对象中。
    • 问:为什么要存在对象中
      因为对象中可以存储键值对,可以把遍历的元素当成 key,元素所在的下标当成 value。这样方便查找,不用重新遍历 hash 对象。
var twoSum = function (nums, target) {
  let hash = {};
  for (let i = 0; i < nums.length; i++) {
    if (hash[target - nums[i]] !== undefined) {
      return [i, hash[target - nums[i]]];
    }
    hash[nums[i]] = i;
  }
  return [];
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值