总结:算法题 JS 容器选择速查表
| 需求 | 用什么 |
|---|---|
| 是否出现过 | Set |
| 不同元素个数 | Set.size |
| 频率统计 | Map |
| 顺序访问 | Array / String |
| 随机访问 | Array / String |
| 去重 | Set |
| 哈希查找 | Set / Map |
JS 容器范式手册:Set、Map、字符串、数组
注意,区分 "值容器 "和"结构容器"
一、String(字符串)范式
字符串是只读的、类数组结构
javascript
let s = "abcde";
s.length // 5
s[0] // "a"
s.charAt(0) // "a"
// 算法遍历范式:
for (let i = 0; i < s.length; i++) {
let ch = s[i];
}
二、Array(数组)范式
数组是有序容器 + 有 length
javascript
let arr = [10, 20, 30];
arr.length // 3
arr[1] // 20
// 遍历范式:
for (let i = 0; i < arr.length; i++) {}
for (const x of arr) {}
// 判重(慢):
arr.includes(x) // O(n)
三、Set(去重集合)范式
Set = 无序、唯一元素集合
javascript
let set = new Set();
set.add("a")
set.add("b")
set.add("a") // 不会重复
set.size // 2
算法题标准用法
1️⃣ 统计不同元素
javascript
let set = new Set();
for (let x of arr) {
set.add(x);
}
let distinct = set.size;
2️⃣ 判断是否存在
set.has(x)
3️⃣ 清空集合
set.clear()
四、Map(计数器 / 哈希表)范式
Map = key → value(非常适合频率统计)
let map = new Map();
1️⃣ 计数范式(高频)
javascript
for (let ch of s) {
map.set(ch, (map.get(ch) || 0) + 1);
}
2️⃣ 取值
map.get("a") // undefined 或 数字
3️⃣ 判断是否存在
map.has("a")