主题
02 · JS 刷题语法速成
目标:刷题时常用数组、
Map/Set、sort比较函数不再查文档。
为什么面试会考
LeetCode 用 JavaScript 写,考的是算法思路,但语法不熟会白白丢分:sort 不写字典序错乱、Map 和对象搞混、边界 length 写错。
把下面当成「刷题工具箱」,背熟能省一半调试时间。
零基础概念:数组基础
javascript
const arr = [3, 1, 4];
arr.length; // 3
arr.push(5); // 尾部加,返回新长度
arr.pop(); // 尾部删,返回被删元素
arr[0]; // 第一个
arr[arr.length - 1]; // 最后一个1
2
3
4
5
6
2
3
4
5
6
解构交换(排序、双指针常用):
javascript
let a = 1, b = 2;
[a, b] = [b, a]; // a=2, b=11
2
2
零基础概念:Map 与 Set
| 结构 | 用途 | 常用 API |
|---|---|---|
Map | 键值映射,键可以是任意类型 | set get has delete |
Set | 去重、判重 | add has delete |
javascript
const map = new Map();
map.set('a', 1);
map.get('a'); // 1
map.has('a'); // true
const set = new Set([1, 2, 2]);
set.size; // 21
2
3
4
5
6
7
2
3
4
5
6
7
对象键的坑:obj[1] 和 obj['1'] 是同一个键(键会转成字符串)。刷题计数、存下标优先用 Map。
零基础概念:sort 必须写比较函数
默认 sort() 按字符串排,[10, 2, 1] 会变成 [1, 10, 2]。
javascript
// 数字升序
nums.sort((a, b) => a - b);
// 数字降序
nums.sort((a, b) => b - a);1
2
3
4
2
3
4
记忆:a - b 升序,b - a 降序。
零基础概念:其他常用
javascript
Math.floor(3.9); // 3,向下取整
Math.max(...arr); // 数组最大值(空数组会报错,先判断 length)
Number.POSITIVE_INFINITY; // 正无穷,求最小值时常用初值
Number.NEGATIVE_INFINITY; // 负无穷1
2
3
4
2
3
4
JS 模板 / 套路
javascript
// 频率统计模板
function countFreq(arr) {
const freq = new Map();
for (const x of arr) {
freq.set(x, (freq.get(x) || 0) + 1);
}
return freq;
}
// 去重模板
function unique(arr) {
return [...new Set(arr)];
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
精讲 1:用 Map 统计频率
题目:给定 ['a','b','a','c'],统计每个字母出现几次。
javascript
var countLetters = function(chars) {
const freq = new Map();
for (const ch of chars) {
freq.set(ch, (freq.get(ch) || 0) + 1);
}
return freq;
};1
2
3
4
5
6
7
2
3
4
5
6
7
- 遍历一次 → O(n)。LeetCode 349、451 等都会用到。
精讲 2:用 sort 正确排序
题目:把 [3, 1, 4, 1, 5] 升序排列。
javascript
var sortAsc = function(nums) {
return [...nums].sort((a, b) => a - b);
};1
2
3
2
3
注意:sort 会改原数组。不想改就先 [...nums] 复制一份。
精讲 3:用 Set 去重
题目:判断数组是否有重复元素(LeetCode 217 简化版)。
javascript
var hasDuplicate = function(nums) {
const seen = new Set();
for (const x of nums) {
if (seen.has(x)) return true;
seen.add(x);
}
return false;
};1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 一次遍历 +
Set.has均摊 O(1) → 整体 O(n)。
练习清单
| 题号 | 一句话提示 |
|---|---|
| LeetCode 217. 存在重复元素 | 本篇 Set 模板直接套 |
| LeetCode 349. 两个数组的交集 | 小数组变 Set,扫大数组 |
| LeetCode 242. 有效的字母异位词 | 用 Map 或长度为 26 的数组计数 |
| LeetCode 56. 合并区间 | 先按左端点 sort((a,b)=>a[0]-b[0]) |
今日验收 checklist
- [ ] 能默写
sort升序、降序比较函数 - [ ] 能独立写出 Map 频率统计、Set 去重两段代码
- [ ] 说清「为什么刷题用 Map 而不是普通对象存数字下标」
- [ ] 在 LeetCode 用 JS 提交 217 或 349
若你以前见过
Python 的 dict/set、C++ 的 map/unordered_set 角色相同。JS 差异:Map 用 .get/.set,Set 用 .has/.add;sort 必须写比较器。
