javascript版数据结构之集合与字典(附:leetCode 1)

330 阅读2分钟

1、集合

  一种无序且唯一的数据结构 实际上, 我们可以把集合想象成一个既没有重复元素,也没有顺序概念的数组

  • js中可以用ES6的Set语法,来表示集合.
  • 集合常用的操作: 去重、求交集、判断某元素是否在集合中

2、js中使用集合

// 声明一个集合
const list = new Set([1, 2, 3, 4, 5])

// 利用集合的特性 无序且唯一  去重
const arr = [1, 2, 1, 3, 3, 2]
const arr2 = [...new Set(arr)] // [1, 2, 3]

// 判断元素是否在集合中
const set = new Set(arr)
set.has(4) // false

// 求交集
const set1 = new Set([1, 2, 3, 4])
const set2 = new Set([11, 2, 23, 3])
const result = new Set([...set1].filter(item => set2.has(item)))
// [2, 3]

3、字典

  与集合类似,字典也是一种存储唯一值的数据结构, 但它是以键值对的形式来存储

  • js中可以用ES6的Map语法,来表示字典.
  • 字典常用的操作: 键值对的增删该查.

4、js中使用字典

const map = new Map()
// 增
map.set('a', 'aa') // { a => aa }
map.set('b', 'bb') // { a => aa, b => bb }
// 删
map.delete('a') // { b => bb }
// map.clear() // 删除全部
// 改
map.set('b', 'bb1') // { b => bb1 }

5、leetCode

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和 为目标值 target  的那两个整数, 并返回它们的数组下标。

  • 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
  • 你可以按任意顺序返回答案。
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let l = 0; // 左指针
    let res = 0
    // 创建一个字典
    const map = new Map();
    for (let i = 0; i < s.length; i++) {
        // 如果遇到重复字符串  将左指针移动到重复字符串的下一位
        // 重复字符串位置不能小于左指针
        if (map.has(s[i]) && map.get(s[i]) >= l) {
            l = map.get(s[i]) + 1
        }
        // 取当前最大长度
        res = Math.max(res, i - l + 1)
        map.set(s[i], i)
    }
    return res
};