/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
// 题目说的是如果s和t每个字符出现次数相通,这让我第一反应就是用一个哈希把字符出现字数储存起来
const hash = new Array(26).fill(0);
const base = 'a'.charCodeAt();
for (let i = 0; i <s.length; i++) {
hash[s.charCodeAt(i) - base] ++;
}
for (let i = 0; i < t.length; i++) {
hash[t.charCodeAt(i) - base] --;
}
for (let i = 0; i < hash.length; i++) {
if (hash[i] !== 0) {
return false;
}
}
return true;
};
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
// 看到题目第一反应就是排序数组,2个数组各拥有自己的指针
var intersection = function (nums1, nums2) {
nums1.sort((a, b) => a - b)
nums2.sort((a, b) => a - b)
let i = 0, j = 0;
let ans = [];
// 排序后使用双指针
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
i++
} else if (nums1[i] > nums2[j]) {
j++
} else {
// 出现元素相同说明相交
ans.push(nums1[i]);
i++;
j++;
}
}
return [...new Set(ans)]
}
// 第二种方法是刚学习到的,使用set去重长度较长的数组,并且储存数组中的元素
var intersection = function (nums1, nums2) {
if (nums1.length < nums2.length) {
let temp = nums2;
nums2 = nums1;
nums1 = temp;
}
let set1 = new Set(nums1);
let resSet = new Set();
// 当循环短的数组时候,一旦发现set1存在相同的元素,说明该元素为交集,用set储存相交的元素,
// 可以防止重复元素的情况
for (let i = 0; i < nums2.length; i++) {
set1.has(nums2[i]) && resSet.add(nums2[i]);
}
// 最后将set转为数组
return Array.from(resSet);
};
相比第一种使用双指针的方法,使用set巧妙的储存,可以减少数组的排序时间成本。
/**
* @param {number} n
* @return {boolean}
*/
function getNext(n) {
if (n == 1 || n == 0) return n;
let res = 0;
while (n) {
res += (n % 10) * (n % 10);
n = parseInt(n / 10);
}
return res;
}
// 题目中提到可能会出现无限循环,始终不为1的情况,需要判断是否出现重复的数来避开无限循环的情况
var isHappy = function (n) {
let set = new Set();
while (n !== 1 && !set.has(n)) {
// 使用set储存出现过的数,一旦再次出现相同的数,说明陷入了无限循环
set.add(n);
n = getNext(n);
}
return n == 1
};
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
// 用map把循环过的数收集起来,用target-nums[i]判断是否存在两数之和为target数
let map = new Map();
for (let i = 0; i <nums.length; i++) {
if (map.has(target - nums[i])) {
return [map.get(target - nums[i]), i];
}
map.set(nums[i], i);
}
};