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)
}
}
};