js算法之集合

499 阅读2分钟

1、集合介绍

代码演示一下 js如何操作

// 数组去重
const arr = [1, 2, 1, 2];
    const arr1 = new Set(arr)
    console.log([...arr1]) // [1,2]  需要加一个[]不加得到的是一个集合内容为 1 2 

// 判断元素 是否在集合内
    const set = new Set([1, 2, 3, 4]) //初始化 集合
    const has = set.has(6)
    console.log(has) // false
    const has1 = set.has(1)
    console.log(has1) // true
    
// 求交集
    const set1 = new Set([1, 2, 3])
    const set2 = new Set([1, 3])
    // set3表示交集  
    // 需要先转化成数组 然后 使用 filter方法筛选出来 set1 set2共有的结果
    const set3 = new Set([...set1].filter(item =>
        set2.has(item)
    ))

    console.log([...set3]) // [1,3]

2、leetcode 349 两个数组交集

// 注意 这里使用数组原生方法 includes更好 
var intersection = function(nums1, nums2) {
    // 时间复杂度 O(m * n) 空间复杂度 O(m) m 指的是 nums1去重后的长度
     return   [...new Set(nums1)].filter(item=> nums2.includes(item))
};

// 数组去重常规方法   很重要的 
    var arr = [1, 1, 2, 3, 3, 6];

    function unique() {
        var hash = [];
        for (var i = 0; i < arr.length; i++) {
        // hash.indexOf(arr[i])      == -1 注意前一部分写法
            if (hash.indexOf(arr[i]) == -1) {
                hash.push(arr[i]);
            }
        }
        return hash;
    }
    console.log(unique(arr))

3、前端于集合 使用 es6 set

1) 展示 new 和 add 方法

// 先展示 add 方法
    var set = new Set();
    set.add(1);
    console.log(set) //Set(1) {1}
    set.add(5);
    console.log(set) //Set(2) {1, 5}
    set.add(5);
    console.log(set) //还是 Set(2) {1, 5} set中不允许 重复

    // 可添加 多种其他类型
    set.add('text');
    console.log(set) //Set(3) {1, 5, "text"} 添加的字符串
    set.add({
        a: 1,
        b: 3
    });
    console.log(set) // Set(4) {1, 5, "text", {…}}  添加对象
    // 看似 又添加了一个完全一样的对象 实则不一样 两个在内存地址中位置不一样
    set.add({
        a: 1,
        b: 3
    });
    console.log(set) //Set(5) {1, 5, "text", {…}, {…}}
    
    
    
     //展示 has方法 
    const has1 = set.has(1)
    console.log(has1) // true
    const has2 = set.has({
        a: 1,
        b: 3
    })
    console.log(has2) // false  对象需要注意 即使对象形式一样 但是在内存上地址不一样
	// 下面 说明这个例子 你可以 大胆试试 
    var obj1 = {
        a: 1,
        b: 6
    }
    var obj2 = {
        a: 1,
        b: 6
    }
    console.log(obj1 === obj2) // false
    
    //delete  
    set.delete(5)
    console.log(set) // 删除了set里面的 5 并且 size减小了 1
    
    
    
    
    

执行delete之后 可以发现 size也变化了

2)Set几种迭代形式

  • 第一种遍历方法 for ... of
// 当然 需要说明的是 这个地方需要使用之前已经定义过的set
 for (let item of set) {
        console.log(item)
    }

结果展示一下

  • 第二种遍历方式 使用keys
for (let item of set.keys()) {
        console.log(item)
    }

  • 第三种方法 使用 values
for (let item of set.values()) {
        console.log(item)
    }

  • 说明了啥情况 ??? 有没有 想一想
set.keys() 与set.vaules() 表达的内容一样??? 怎么验证一下这个问题 ?
当然 两个 === 关系是 不成立的  不要问我怎么知道 --
// 验证 
    for ([keys, values] of set.entries()) {
        console.log(keys, values)
    }

// 万一结果 不是这样 我的脸不是被打肿了嘛 希望不是 // nice 很开心 它是我们预期的结果,这很重要

3)set <---> Array互相转化 ???? 怎么操作 ?

  • 先说 如何实现 set ---> Array
// 思想 : 展开 / Array.from  /  Array.of 方法
// 第一种方法
    var myArr = [...set]
    console.log(myArr) //(4) [1, "text", {…}, {…}]
    // 第二种方法
    var myArr1 = Array.from(set)
    console.log(myArr1) //(4) [1, "text", {…}, {…}]
    // 第三种方法
    var myArr2 = Array.of(set)
    console.log(myArr2) // [Set(4)] 在整个外面套了一层数组
  • 再说一下 Array ---> set
//   思想: 把数组放进 new Set(...) 里面
var set2 = new Set([1, 2, 3, 4])
    console.log(set2) //Set(4) {1, 2, 3, 4}

4)求 Set 交集

// 思想: 先转为数组 使用 数组方法筛选出来两个交集部分 
    var set1 = new Set([1, 2, 3])
    var set2 = new Set([1, 2])
    var myArr = [...set1].filter(x =>
        set2.has(x))
    console.log(myArr)   //  [1, 2]

5)求 Set 差集

// 思想: 第一个有但第二个没有的部分
var set1 = new Set([1, 2, 3])
    var set2 = new Set([1, 2])
    var myArr = ([...set1].filter(x =>
        !set2.has(x)
    ))
    console.log(myArr) //  [3] 

4、总结