⑥ 数据结构之“集合”
一、 理论
1. 集合简介
- 一种 无序且唯一 的数据结构
- es6中有集合Set
- 集合的常用操作:去重、判断某元素是否在集合中、求交集
1.1 去重
// set
const arr = [1, 1, 2, 2]
const arr2 = [...new Set(arr)]
1.2 判断元素是否在集合中
const set = new Set(arr)
set.has(1)
set.has(2) // true
set.has(3) // false
1.3 求交集
const set2 = new Set([2, 3])
const set3 = new Set([...set].filter(item => set2.has(item)))
二、刷题
1. 两个数组的交集(349)
1.1 题目描述
- 给定两个数组,编写一个函数来计算它们的交集
- 说明
- 输出结果中的每个元素一定是唯一的
- 我们可以不考虑输出结果的顺序
1.2 解题思路
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
- 求交集且无序唯一
1.3 解题步骤
- 用集合对nums1去重
- 遍历nums1,筛选出nums2也包含的值
function intersection(nums1, nums2) {
return [...new Set(nums1)].filter(n => nums2.includes(n))
}
1.4 时间复杂度&空间复杂度
- 时间复杂度:O(n*m)
- 空间复杂度:O(n)
2. 使用ES6的Set(前端与集合)
- 使用Set操作:new、add、delete、has、size
- 迭代Set:多种迭代方法、Set与Array互转、求交集差集
2.1 add操作
// set
let mySet = new Set()
mySet.add(1)
mySet.add(5)
mySet.add(5)
mySet.add('hello world')
let o = { a: 1, b: 2 }
mySet.add(o)
mySet.add({ a: 1, b: 2 })
2.2 has操作
const has = mySet.has('hello world')
const has2 = mySet.has({ a: 1, b: 2 })
const has3 = mySet.has(o)
2.3 delete操作
mySet.delete(5)
2.4 迭代
- for...of
for(let item of mySet) console.log(item)
for(let item of mySet.keys()) console.log('keys', item)
for(let item of mySet.values()) console.log('values', item)
for(let [key, value] of mySet.entries()) console.log('values', key, value)
2.5 Set与Array互转
- Set转Array
const myArr = [...mySet]
const myArr = Array.from(mySet)
- Array转Set
const mySet2 = new Set([1, 2, 3, 4])
2.6 求交集
const intersection = new Set([...mySet].filter(x => mySet2.has(x)))
2.7 求差集
const difference = new Set([...mySet].filter(x => !mySet2.has(x)))
三、总结 -- 技术要点
- 集合是一种 无序且唯一 的数据结构
- es6中有集合Set
- 集合的常用操作:去重、判断某元素是否在集合中、求交集...
浙公网安备 33010602011771号