242.有效的字母异位词
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length !== t.length) return false // 如果字符长度不相等,就不是异位词
let resSet = new Array(26).fill(0) // 创建26个英文字母长度的数组
const base = 'a'.charCodeAt() // 以字母a的Unicode编码为基础
for(let i = 0; i < s.length; i++) {
resSet[s.charCodeAt(i) - base]++ // resSet数组中每一个字母的位置根据s的字符串而内容增加
resSet[t.charCodeAt(i) - base]-- // 根据t的字符串内容--
// [1,0,0,0,0...0] 1 代表有1个字母a
}
// 所以循环完毕后,如果是异位词,则每一项都应该是0,否则就不是异位词
return resSet.every(i => i===0 )
};
中间循环加减地方对我来说有些不太好理解,只能这么描述了,希望大家有更好的看法来补充。
349. 两个数组的交集
这个要使用set去重,循环更长的那个数组,判断另一个的item是否在当前数组中,注意Array.from()将set转化为真正的数组
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
if(nums1.length < nums2.length) {
let _ = nums2
nums2 = nums1
nums1 = _
}
const nums1Set = new Set(nums1)
return Array.from(new Set(nums1.filter(i => nums2.includes(i))))
// for(let i = nums2.length - 1; i >= 0; i--) {
// nums1Set.has(nums2[i]) && resSet.add(nums2[i]);
// }
// return Array.from(resSet)
};
- 快乐数,还没总结好,继续加油
1. 两数之和
经典的两数之和来了。。
查找一个元素是否在某个集合中,或者是否出现过,使用map更合适,匹配的括号那个题目也应该是使用map
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let numMap = new Map()
for(let i = 0; i < nums.length;i++) {
const res = target - nums[i] // target - 当前元素
if(numMap.has(res)) {
return [numMap.get(res), i] // 如果map中有这个差,就把存在map中差对应的index 和当前元素的index返回
} else {
numMap.set(nums[i], i) // 如果map中没有,就把当前元素的值和index都存起来,map的key是值,value是index
}
}
};
代码参照代码随想录