模式介绍
先记录,后面的数据对照记录,产生开关,开关对应逻辑。比如利用map判定是否为异位词、进行数组去重。
记录和擦除记录
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
function isAnagram(s, t){
// 先创建一个记事本
const obj = {}
// 遍历第一个字符串,在记录本上留下记录 ? 怎样记录, 有对应用字母就加 1 呗
// 每个字母划一道
for (let i=0; i<s.length; i++){
if(obj[s[i]]){
obj[s[i]]++
}else{
obj[s[i]] = 1
}
}
// 遍历第二侬字符串,记事上修改,有对应字母就减 1, 每个字母擦对应的一道
for (let i = 0; i< t.length; i++){
if(obj[t[i]]){
obj[t[i]]--
}else{
// 多余的字母都用-1
obj[t[i]] = -1
}
}
const values = Object.values(obj)
// 记录本上每一个字母对应的值都等于 0
return values.every((val)=> val === 0)
}
- obj = {}就是创建一个记录本,
- 把第一个字符串遍历一遍,每个字母对应的值划一道,即字母对应默认值为1,重复的字母对应值加1
- 遍历第二个字符串,对照记录本的里字母,有值就擦去一道,即减1,余的字母标成 -1,
- 拿到记录本里字母对应的所有值,如果都为0,证明都擦干净了,如果里面有-1,证明擦深了(重复多的字母)或 多余的字母。
未记录和已记录
记录本在数组去重的应用
function deleteDuplication(arr){
// 记录本
const map = new Map()
const result = []
for(let i = 0; i < arr.length; i++){
// 如果没记录过,就记录下, 没记录过肯定是新的,收集起来
if(!map.has(arr[i])){
map.set(arr[i], 1)
result.push(arr[i])
}
}
return result
}
通过记录找配对
两数之和的题目
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
function twoSum(nums, target){
// 记录 9-x的结果,key 为 9-x的结果,value
const map = new Map()
for(let i = 0; i<nums.length; i++){
// 如果没找到想要的对象,先登记自已的位置,等后面遍历检测到 target - 当前 就是当前想要的
if(!map.has(target - nums[i])){
// 先登记,
map.set(nums[i], i)
}else{
return [map.get(target - nums[i]), i]
}
}
}