前端常见数据结构与算法整理--字典

277 阅读2分钟

概念

  1. 一种用来存储唯一值的数据结构,通常以键值对的方式存储。
  2. es6中拥有字典这个数据结构,叫做map。map(映射)

map常用操作(增删改查)

增加

const m = new Map()

m.set('a','aa')
m.set('b','bb')
//a和aa分别对应k和v,组成一个kv对

查询

m.get('a')
//通过get方法和key来查询key所对应的value

删除

m.delete('a')
// 将key传入delete方法中可删除key所对应的value

m.clear()
// 直接调用clear方法会清空m里的所有值

修改

m.set('a','aaa')
// 再次调用set方法传入你要修改的key和修改后的value,对原来的值进行覆盖

leetcode相关算法题

T349 两个数组的交集

  • 给定两个数组,编写一个函数来计算它们的交集。
  • 示例 1:
  • 输入:nums1 = [1,2,2,1], nums2 = [2,2]
  • 输出:[2]
  • 示例 2:
  • 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
  • 输出:[9,4]

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/in… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:遍历第一个数组,然后将遍历到的数组传入新创建的map中,k为这个数,v为true,然后遍历第二个数组,如果将第二个数组中的数调用get方法可以得到值,则证明map中已经有这个数了,将其推入结果数组,然后将这个kv对删除

var intersection = function(nums1, nums2) {
    const map = new Map()
    nums1.forEach(item => {
        map.set(item,true)
    })
    const res = []
    nums2.forEach(item => {
        if(map.get(item)){
            res.push(item)
            map.delete(item)
        }
    })
    return res
};

T20 有效的括号

  • 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

  • 有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。

  • 左括号必须以正确的顺序闭合。

  •  

  • 示例 1:

  • 输入:s = "()"

  • 输出:true

  • 示例 2:

  • 输入:s = "()[]{}"

  • 输出:true

  • 示例 3:

  • 输入:s = "(]"

  • 输出:false

  • 示例 4:

  • 输入:s = "([)]"

  • 输出:false

  • 示例 5:

  • 输入:s = "{[]}"

  • 输出:true

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:
先将所有括号存到map中,左括号为k,右括号为v,结合栈的思想,将所有数据遍历,如果map.get(i)不为flase则证明是左括号,否则就是右括号,然后将栈顶元素调用get方法得到对应的值进行比较,相同则出栈

var isValid = function(s) {
    if(s.length % 2 != 0 ){return false}
    const stack = []
    const map = new Map()
    map.set('(',')')
    map.set('{','}')
    map.set('[',']')
    for (let i = 0;i< s.length;i++){
        let c = s[i]
        if(map.get(c)){
            stack.push(c)
        }else{
            const top = stack[stack.length-1]
            if ( map.get(top) === c){
                    stack.pop()
                }else{
                    return false
                }
        }
    }
    return stack.length === 0
};

T1 : 两数之和:

  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
  • 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
  • 你可以按任意顺序返回答案。
  • 示例 1:
  • 输入:nums = [2,7,11,15], target = 9
  • 输出:[0,1]
  • 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/tw… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:将数和target—i的差保存至map中进行匹配

var twoSum = function(nums, target) {
    const map = new Map()
    for(let i =0;i<nums.length;i++){
        let tar = target - nums[i]
        if(map.has(tar)){
            return([map.get(tar),i])
        }else{
            map.set(nums[i],i)
        }
    }
};

T3 无重复最长字串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:

输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:双指针滑动窗口,并记录当前最长字串的length,把遍历到的数据存入map中

var lengthOfLongestSubstring = function(s) {
    let l = res = 0
    const map = new Map()
    for(let r = 0;r<s.length;r++){
        if(map.has(s[r]) && map.get(s[r]) >= l){
            l = map.get(s[r]) + 1
        }
        res = Math.max(res,r-l+1)
        map.set(s[r],r)
    }
    return res
};