主题
01 · 怎么学 + 复杂度 + LeetCode 上手
目标:知道算法怎么学、能说清 Big-O,并在 LeetCode 用 JavaScript 提交第一道题。
为什么面试会考
前端面试不只考框架。很多公司会问数组、哈希、双指针这类基础题,看你能不能想清楚、写得出、说得清。
算法题考三件事:
- 思路:能不能把问题拆成步骤。
- 代码:能不能用 JS 写出来、边界不翻车。
- 复杂度:能不能说「为什么这解法够快」。
零基础概念:怎么学算法
推荐节奏(每天 60~90 分钟):
text
1. 读一篇本系列教程(10~15 分钟)
2. 跟着精讲题敲一遍 JS(20~30 分钟)
3. 自己再写一遍,不看答案(20 分钟)
4. 做练习清单里 1~2 道(剩余时间)1
2
3
4
2
3
4
三条原则:
| 原则 | 意思 |
|---|---|
| 先暴力再优化 | 先写出能跑的,再想办法变快 |
| 合上答案再写 | 看题解只记套路,必须自己默写一遍 |
| 每题留一句总结 | 例如「用 Map 存已见过的数」 |
零基础概念:Big-O(时间复杂度)
Big-O 描述:数据变大时,步骤数大概怎么涨。只保留最高项,常数忽略。
| 记号 | 直觉 | 典型例子 |
|---|---|---|
| O(1) | 不管多长,一步搞定 | 取数组第一个元素 |
| O(n) | 扫一遍 | 找最大值 |
| O(n²) | 两层循环,两两配对 | 判断是否有重复对 |
| O(log n) | 每次砍掉一半 | 有序数组二分查找(后面会学) |
n = 输入规模(如数组长度)。面试时说「这是 O(n) 因为只遍历一次」就够。
JS 模板 / 套路:LeetCode 上手流程
- 打开 leetcode.cn,注册账号。
- 选题 → 右上角语言选 JavaScript。
- 函数签名不要改,只写函数体。
- 本地先想 3 个用例:空、一个元素、正常。
- 提交 → 错了看报错,改完再提交。
javascript
/**
* @param {number[]} nums
* @return {number}
*/
var maxValue = function(nums) {
// 你的代码
};1
2
3
4
5
6
7
2
3
4
5
6
7
精讲 1:找数组最大值 — O(n)
思路:假设第一个最大,从第二个开始比,更大就更新。
javascript
var findMax = function(nums) {
let max = nums[0];
for (let i = 1; i < nums.length; i++) {
if (nums[i] > max) max = nums[i];
}
return max;
};1
2
3
4
5
6
7
2
3
4
5
6
7
- 循环
n - 1次 → O(n)。 - 额外变量 → 空间 O(1)。
精讲 2:判断是否有重复对 — 暴力 O(n²)
题目:数组里是否存在 i ≠ j 且 nums[i] === nums[j]?
暴力:两层循环,两两比较。
javascript
var hasDuplicatePair = function(nums) {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] === nums[j]) return true;
}
}
return false;
};1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 外层 n 次,内层最多 n 次 → O(n²)。
- 数据大时会慢;后面会用
Set优化到 O(n)(见第 02 篇)。
对比记忆:扫一遍是 O(n),两两配对是 O(n²)。
练习清单(先提示,自己写)
| 题号 | 一句话提示 |
|---|---|
| LeetCode 704. 二分查找 | 有序数组,每次砍一半,注意 left/right 边界 |
| LeetCode 217. 存在重复元素 | 用 Set:见过就 true,没见过就加入 |
| LeetCode 1. 两数之和 | 先想两层循环暴力,再想 Map(第 03 篇精讲) |
今日验收 checklist
- [ ] 能用自己的话解释 O(1)、O(n)、O(n²) 各举一个例子
- [ ] 在 LeetCode 选好 JavaScript,成功提交任意一题
- [ ] 独立写出「找最大值」和「重复对暴力」两段 JS
- [ ] 每题写下时间复杂度一句话
若你以前见过
蓝桥或 C++ 刷过题:复杂度概念一样,只是语言换成 JS。重点补:LeetCode 提交格式、用 Map/Set 代替 unordered_map。本系列从零讲 JS 写法,不依赖旧语法。
