242. 有效的字母异位词
要求:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:** 若 s 和 t **中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
思路
- 采用map作为哈希表记录字符
s的每个字母,再遍历字符t,若map中有此字符则-1,否则返回false,之后再次查看map的value,若全为0,则返回true,否则返回false。
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
let map = new Map()
for(let i=0; i<s.length; i++){
if(map.has(s[i])){
map.set(s[i], map.get(s[i])+1)
}else{
map.set(s[i], 1)
}
}
for(let i=0; i<t.length; i++){
if(map.has(t[i])){
map.set(t[i], map.get(t[i])-1)
}else{
return false
}
}
for(value of map.values()){
if(value !== 0){
return false
}
}
return true
};
- 以26位数组记录字符串中字符的ASCII值。
var isAnagram = function(s, t) {
if(s.length !==t.length) return false
let map = new Array(26).fill(0)
let base = 'a'.charCodeAt()
for(let i=0; i<s.length; i++){
map[s[i].charCodeAt()-base]++
}
for(let i=0; i<t.length; i++){
//如果length长度相等,那必有一字符在map中为负数
if(!map[t[i].charCodeAt()-base]) return false
map[t[i].charCodeAt()-base]--
}
return true
};
349. 两个数组的交集
要求:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思路
什么时候用数组作为哈希,什么时候用set和map作为哈希,取决于题目是否限制了数值的大小
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
let res = new Set()
let set = new Set()
for(let i=0; i<nums1.length; i++){
set.add(nums1[i])
}
for(let i=0; i<nums2.length; i++){
if(set.has(nums2[i])){
res.add(nums2[i])
}
}
return [...res]
};
202. 快乐数
要求:编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
思路
本题的思路是 1.快乐数的计算方式 2.如何判断是否是快乐数
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
let set = new Set()
function getSum(n){
let sum = 0
while(n){
sum += (n%10) * (n%10)
n = Math.floor(n/10)
}
return sum
}
while(1){
let sum = getSum(n)
if(sum == 1) return true
if(set.has(sum)){
return false
}else{
set.add(sum)
}
n = sum
}
};
1. 两数之和
要求:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路
本题遍历数组nums,然后去map中找是否存在与当前元素相匹配的(也就是相加等于target),如果有,则返回两数之下标,否则将元素存入map中。
用哈希表map是用于存放之前遍历过的元素,且必须使用map结构因为找到相匹配的元素之后需要返回其下标,map中的key用来存放元素nums[i], value用于存放元素下标i。
var twoSum = function(nums, 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]
}else {
map.set(nums[i], i)
}
}
return []
};