算法中的记录本模式

188 阅读2分钟
模式介绍

先记录,后面的数据对照记录,产生开关,开关对应逻辑。比如利用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)
        }

  1. obj = {}就是创建一个记录本,
  2. 把第一个字符串遍历一遍,每个字母对应的值划一道,即字母对应默认值为1,重复的字母对应值加1
  3. 遍历第二个字符串,对照记录本的里字母,有值就擦去一道,即减1,余的字母标成 -1,
  4. 拿到记录本里字母对应的所有值,如果都为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]
        }
    }

}
总结:记录本可以1、记录、擦除、2、已记录、3、通过记录找配对