第六章-数据结构之集合

集合简介

  • 集合是一种 无序且唯一 的数据结构
  • ES6 中有集合,名为 Set
  • 集合的常用操作:去重、判断某元素是否在集合中、求交集...
// 数组去重
const arr = [1, 2, 3, 3, 2, 1];
const set = [...new Set(arr)]
console.log(set); // [1,2,3]

// 判断集合中是否存在某个值
const set1 = new Set(arr);
// const has = set1.has(1); // true
const has = set1.has(5); // false

// 求集合交集
const set2 = new Set([2, 3]);
// filter 返回一个数组
const set3 = new Set([...set2].filter(item => set1.has(item)));
console.log(set3); // Set {2,3}

LeetCode 349 两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

示例

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]

说明:

  • 输出结果中的每个元素一定是唯一的。
  • 我们可以不考虑输出结果的顺序。

【解题思路】

  • 求交集且无需唯一
  • 使用集合

【解题步骤】

  • 用集合对 nums1 去重。
  • 遍历 nums1,筛选出 nums2 也包含的值

【复杂度分析】

  • 时间复杂度:O(m*n) --- filter 的复杂为 O(n)、includes 的复杂度为 O(m)
  • 空间复杂度:O(m) --- 返回过滤后的交集数组
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    // 如果  nums2.includes(item) 为 true,那就将当前的 item 返回到一个数组中
    return [...new Set(nums1.filter(item => nums2.includes(item)))]
};

filter() 方法 为数组中的每个元素调用一次 callback 函数,并利用所有使得" callback 返回 true 或 等价于 true 的值 的元素"创建一个新数组。

前端与集合:使用 ES6 中的 Set

  • ES6 提供了新的数据结构集合--Set,它的值是无序且唯一的。

  • Set 本身是一个构造函数,用来生成 Set 数据结构。

    const set = new Set();
    
  • Set 函数可以接受一个数组作为参数,用来初始化。

    const set = new Set([1,2,3]); // Set(3) {1, 2, 3}
    

实例方法

  • add(value): 添加某个值,返回Set结构本身,可以链式添加
  • delete(value): 删除某个值,返回一个布尔值,表示删除是否成功
  • has(value): 返回一个布尔值,表示该值是否为Set的成员
  • clear(): 清除所有的成员,没有返回值
const s = new Set();
 s.add(1).add(2).add(3); // 向 set 结构中添加值, 返回 Set 本身
 s.delete(2)             // 删除 set 结构中的2值,删除成功返回 true   
 s.has(1)                // 表示 set 结构中是否有1这个值 返回布尔值 
 s.clear()               // 清除 set 结构中的所有值
 //注意:删除的是元素的值,不是代表的索引

遍历

  • Set 结构的实例与数组是一样的,也拥有 forEach 方法,用于对每一个成员执行某种操作,没有返回值。

    const set = new Set([1,2,3,4,5])
    set.forEach(val => console.log(val)); // 1,2,3,4,5
    
  • for...of...

    const set = new Set([1,2,3,4,5])
    for (let item of set) {
        console.log(item); // 1,2,3,4,5
    }
    
    for (let item of set.keys()) {
        console.log(item); // 1,2,3,4,5
    }
    
    for (let item of set.values()) {
        console.log(item); // 1,2,3,4,5
    }
    
    for (let (key, val) of set.entries) {
        console.log(key, val); // 1,1; 2,2; 3,3; 4,4; 5,5
    }
    

    Set 数据结构的键和值是一样的

数组和Set相互转换

// 将数组转为Set
const set = new Set([1,2,3])
// 将 Set 转为数组
const arr = [...set]
const arr1 = Array.from(set)

求交集/差集

const set1 = new Set([1,2,3]);
const set2 = new Set([3]);
// 交集 === [...set1].filter(item => set2.has(item)) 返回交集组成的数组
const interSection = new Set([...set1].filter(item => set2.has(item)))

// 差集 === !set2.has(item) 表示 set2 没有这一项则返回
const difference = new Set([...set1].filter(item => !set2.has(item)))
posted @ 2020-11-09 15:38  公瑾当年  阅读(147)  评论(0编辑  收藏  举报