​Leetcode代码算法(哈希表) —— ​有效的字母异位词、两个数组的交集、快乐数

​有效的字母异位词

Leetcode题目链接

审题可知s字符串和t字符串只包含小写字母。因此可以初始化一个长度为26的数组,下标0对应字母a、下标25对应字母z,数组值对应字符串的出现次数。再看看s和t是否有这样两个相等的数组即可:

代码实现如下:

var isAnagram = function(s, t) {
  const resSet = new Array(26).fill(0);
  const base = "a".charCodeAt();

  for (let i = 0; i < s.length; i++) {
    const resIndex = s[i].charCodeAt() - base;
    if (!resSet[resIndex]) {
      resSet[resIndex] = 1;
    } else {
      resSet[resIndex] += 1;
    }
  }

  for (let i = 0; i < t.length; i++) {
    const resIndex = t[i].charCodeAt() - base;
    resSet[resIndex] -= 1;
  }

  for (let i = 0; i < resSet.length; i++) {
    if (resSet[i] !== 0) {
      return false;
    }
  }

  return true;
};

两个数组的交集

Leetcode题目链接

这题用Set类型很容易实现:给数组1设置对应的Set1,遍历数组2看看是否存在Set1的数值,如果存在则复制到新的Set2中。Set类型的数值唯一性天然可以给子集去重。

代码实现如下:

var intersection = function(nums1, nums2) {
  const nums1Set = new Set();
  const newSet = new Set();

  for (let i = 0; i < nums1.length; i++) {
    nums1Set.add(nums1[i]);
  }

  for (let i = 0; i < nums2.length; i++) {
    if (nums1Set.has(nums2[i])) {
      newSet.add(nums2[i]);
    }
  }

  return Array.from(newSet);
};

快乐数 

Leetcode题目链接

该题的关键是题目中提到的无限循环,就是说求和过程中,sum会重复出现。因此可以初始化一个哈希表用于记录之前的sum,如果有重复出现的sum则该数字不是快乐数

var isHappy = function(n) {
  const mySet = new Set();
  let cur = n;

  const getSum = (num) => {
    const numStr = `${num}`;
    const numArr = [];

    for (let i = 0; i < numStr.length; i++) {
      numArr.push(Number(numStr[i]));
    }
    
    const r = numArr.reduce((sum, current) => {
      return sum + current * current;
    }, 0);

    return r;
  }

  while (true) {
    const sum = getSum(cur);

    if (mySet.has(sum)) {
      return false;
    } else if (sum === 1) {
      return true;
    }

    mySet.add(sum);
    cur = sum;
  }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值