no message
This commit is contained in:
parent
edab31e4b8
commit
0dd2762be3
@ -7,6 +7,10 @@
|
||||
|
||||
### 反转链表
|
||||
|
||||
**是什么**:将链表中所有节点的指向反转,原来的尾节点变成头节点,原来的头节点变成尾节点。
|
||||
|
||||
**解决什么问题**:实现浏览器的后退功能、回文链表判断、链表相加时需要从低位开始等场景。
|
||||
|
||||
```js
|
||||
function reverseList(head) {
|
||||
let prev = null, curr = head; // prev 记录前一个节点
|
||||
@ -54,6 +58,10 @@ function hasCycle(head) {
|
||||
|
||||
### 合并有序链表
|
||||
|
||||
**是什么**:将两个已排序的链表合并成一个新的有序链表。
|
||||
|
||||
**解决什么问题**:归并排序的核心操作、多个有序数据源的合并(如合并多个排行榜)、K路归并问题的基础。
|
||||
|
||||
```js
|
||||
function mergeTwoLists(l1, l2) {
|
||||
const dummy = { next: null }; // 哑节点,简化处理
|
||||
@ -82,6 +90,10 @@ function mergeTwoLists(l1, l2) {
|
||||
|
||||
### 遍历(前中后序)
|
||||
|
||||
**是什么**:按照特定顺序访问树中的每个节点。前序(根-左-右)、中序(左-根-右)、后序(左-右-根)。
|
||||
|
||||
**解决什么问题**:前序用于复制树结构、序列化;中序用于二叉搜索树获取有序数组;后序用于计算目录大小、删除节点。
|
||||
|
||||
```js
|
||||
// 前序遍历:根 -> 左 -> 右(先访问根节点)
|
||||
const preorder = (root, res = []) => {
|
||||
@ -113,6 +125,10 @@ const postorder = (root, res = []) => {
|
||||
|
||||
### 求最大深度
|
||||
|
||||
**是什么**:计算从根节点到最远叶子节点的最长路径上的节点数。
|
||||
|
||||
**解决什么问题**:判断 DOM 树嵌套层级是否过深、计算组织架构层级、平衡树检测的基础操作。
|
||||
|
||||
```js
|
||||
// 递归求最大深度:左右子树深度的较大值 + 1
|
||||
const maxDepth = root => {
|
||||
@ -123,6 +139,10 @@ const maxDepth = root => {
|
||||
|
||||
### 路径和
|
||||
|
||||
**是什么**:判断树中是否存在一条从根到叶子的路径,使得路径上所有节点值之和等于目标值。
|
||||
|
||||
**解决什么问题**:决策树路径分析、文件系统权限累加判断、游戏技能树点数计算。
|
||||
|
||||
```js
|
||||
// 判断是否存在根到叶子的路径,使得路径上所有节点值之和等于目标值
|
||||
function hasPathSum(root, targetSum) {
|
||||
@ -144,6 +164,10 @@ function hasPathSum(root, targetSum) {
|
||||
|
||||
### 用栈实现队列
|
||||
|
||||
**是什么**:使用两个栈(后进先出)来模拟队列(先进先出)的行为。
|
||||
|
||||
**解决什么问题**:理解数据结构转换思想、在只支持栈操作的环境中实现队列、面试高频考点。
|
||||
|
||||
```js
|
||||
// 使用两个栈实现队列:入栈和出栈
|
||||
class MyQueue {
|
||||
@ -178,6 +202,10 @@ class MyQueue {
|
||||
|
||||
### 有效的括号
|
||||
|
||||
**是什么**:判断一个只包含括号的字符串中,所有括号是否正确配对和嵌套。
|
||||
|
||||
**解决什么问题**:代码编辑器语法检查、表达式合法性验证、HTML/XML 标签配对检测。
|
||||
|
||||
```js
|
||||
function isValid(s) {
|
||||
// 右括号到左括号的映射
|
||||
@ -204,6 +232,10 @@ function isValid(s) {
|
||||
|
||||
### 两数之和
|
||||
|
||||
**是什么**:在数组中找到两个数,使它们的和等于目标值,返回这两个数的索引。
|
||||
|
||||
**解决什么问题**:配对查找问题的基础模型、购物车凑单、找零钱问题的简化版。
|
||||
|
||||
```js
|
||||
// 用哈希表存储已遍历的数字及其索引
|
||||
function twoSum(nums, target) {
|
||||
@ -219,6 +251,10 @@ function twoSum(nums, target) {
|
||||
|
||||
### 字母异位词分组
|
||||
|
||||
**是什么**:将字母相同但顺序不同的单词归为一组(如 "eat" 和 "tea")。
|
||||
|
||||
**解决什么问题**:搜索引擎同义词处理、单词游戏(如 Wordle 变体)、文本相似度分析。
|
||||
|
||||
```js
|
||||
// 异位词排序后结果相同,以此为 key 分组
|
||||
function groupAnagrams(strs) {
|
||||
@ -240,6 +276,10 @@ function groupAnagrams(strs) {
|
||||
|
||||
### 快速排序
|
||||
|
||||
**是什么**:选取一个基准值,将数组分成小于和大于基准值的两部分,递归排序。平均 O(n log n)。
|
||||
|
||||
**解决什么问题**:通用排序场景、理解分治思想、Top K 问题可用快速选择优化。
|
||||
|
||||
```js
|
||||
// 快速排序:分治思想,选取基准值分区
|
||||
function quickSort(arr) {
|
||||
@ -255,6 +295,10 @@ function quickSort(arr) {
|
||||
|
||||
### 归并排序
|
||||
|
||||
**是什么**:将数组不断二分到单个元素,再两两合并成有序数组。稳定排序,O(n log n)。
|
||||
|
||||
**解决什么问题**:需要稳定排序的场景、外部排序(大文件排序)、求逆序对数量。
|
||||
|
||||
```js
|
||||
// 归并排序:分治思想,先拆分再合并
|
||||
function mergeSort(arr) {
|
||||
@ -287,6 +331,10 @@ function merge(left, right) {
|
||||
|
||||
### 基础二分查找
|
||||
|
||||
**是什么**:在有序数组中,每次比较中间元素,将搜索范围缩小一半。O(log n) 时间复杂度。
|
||||
|
||||
**解决什么问题**:有序数据快速定位、Git bisect 查找 bug 引入版本、分页跳转到指定页。
|
||||
|
||||
```js
|
||||
// 标准二分查找:在有序数组中查找目标值
|
||||
function binarySearch(arr, target) {
|
||||
@ -303,6 +351,10 @@ function binarySearch(arr, target) {
|
||||
|
||||
### 旋转数组查找
|
||||
|
||||
**是什么**:在一个被旋转过的有序数组(如 [4,5,6,7,0,1,2])中查找目标值。
|
||||
|
||||
**解决什么问题**:日志轮转后的时间查找、循环数组中的搜索、二分查找的变体考察。
|
||||
|
||||
```js
|
||||
// 旋转数组查找:数组被旋转过,如 [4,5,6,7,0,1,2]
|
||||
function searchRotated(nums, target) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user