有效的字母异位词
审题可知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;
};
两个数组的交集
这题用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);
};
快乐数
该题的关键是题目中提到的无限循环,就是说求和过程中,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;
}
};