Set

一、集合是什么?与它相关数学概念有哪些?

集合的定义。

集合(Set)是由一组无序且唯一(就是不重复)的项组成。

与集合相关的数学概念。

空集:有一类特殊的集合,它不包含任何元素

交集:由属于A集合且属于B集合的相同元素组成的集合

子集:A集合包含了B集合所有元素

补集:由属于A集合且不属于B集合的元素组成的集合

二、请实现一个集合,并实现以下方法:

  • add(value):向集合添加一个新的项。
  • delete(value):从集合移除一个值。
  • has(value):如果值在集合中,返回 true,否则返回 false。
  • clear():移除集合中的所有项。
  • size():返回集合所包含元素的数量。与数组的 length 属性类似。
  • values():返回一个包含集合中所有值的数组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class MySet {
constructor() {
this.item = {};
}
add(value) {
if (!this.has(value)) {
this.item[value] = value;
return true;
} else {
return false;
}
}
delete(value) {
if (this.has(value)) {
delete this.item[value];
return true;
} else {
return false;
}
}
has(value) {
return this.item.hasOwnProperty(value);
}
clear() {
this.item = {};
}
size() {
return Object.keys(this.item).length;
}
values() {
return Object.values(this.item);
}
}

三、请实现集合的并集、交集、差集、子集操作

1.并集(union):对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。

WX20190722-220417@2x

1
2
3
4
5
6
7
8
9
10
11
12
13
function union(setA, setB) {
let set = new MySet();
let values = setA.values(), len = values.length;
for (let i = 0; i < len; i++) {
set.add(values[i]);
}
values = setB.values();
len = values.length;
for (let i = 0; i < len; i++) {
set.add(values[i]);
}
return set;
}

2.交集(intersection):对于给定的两个集合,返回一个包含两个集合中共用元素的新集合。

WX20190722-220450@2x

1
2
3
4
5
6
7
8
9
10
function intersection(setA, setB) {
let set = new MySet();
let values = setA.values(), len = values.length;
for (let i = 0; i < len; i++) {
if (setB.has(values[i])) {
set.add(values[i]);
}
}
return set;
}

3.差集(difference):对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。

WX20190722-220511@2x

1
2
3
4
5
6
7
8
9
10
function diffrence(setA, setB) {
let set = new MySet();
let values = setA.values(), len = values.length;
for (let i = 0; i < len; i++) {
if (!setB.has(values[i])) {
set.add(values[i]);
}
}
return set;
}

4.子集(subset):验证一个给定集合是否是另一个集合的子集。

WX20190722-220537@2x

1
2
3
4
5
6
7
8
9
10
function subset(setA, setB) {
if (setA.size() > setB.size()) return false;
let values = setA.values(), len = values.length;
for (let i = 0; i < len; i++) {
if (!setB.has(values[i])) {
return false;
}
}
return true;
}

四、给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
const nums = [1, 2, 3];
subsets(nums);
// 输出以下结果:
[
[]
[1],
[2],
[1, 2],
[3],
[1, 3],
[2, 3],
[1, 2, 3],
]
1
2
3
4
5
6
7
8
9
10
11
function subsets(nums) {
let arr = [[]];
for (let i = 0; i < nums.length; i++) {
let newArr = arr.map(item => {
return item.concat(nums[i]);
});
arr = arr.concat(newArr);
}

return arr;
}