前端面试常见的一些算法题有什么,请给出例题以及答案
时间: 2025-06-02 19:27:22 浏览: 42
<think>嗯,用户让我介绍一下前端面试中常见的算法题,还要给出例题和答案。首先,我需要回想一下自己之前准备面试时遇到的题目,或者看看网上常提到的那些问题。前端面试虽然更侧重实际应用,但算法题也是必不可少的,尤其是大公司。常见的算法题类型有哪些呢?
首先,数组和字符串处理应该是比较常见的。比如去重、反转、统计字符出现次数之类的。然后是链表、栈、队列这些数据结构相关的题目。前端可能不太涉及太复杂的结构,但基本的还是需要的。接下来是树,尤其是二叉树,比如遍历、查找深度这些。还有排序算法,虽然前端可能自己实现的不多,但快速排序、归并排序这些常考。动态规划和双指针可能也会出现,但可能难度不会太高。另外,实际应用类的问题,比如手写Promise、函数柯里化这些,虽然不算传统算法题,但有时候也被归类进去。
然后要考虑例题和答案。比如数组去重,可以用ES6的Set,但也要知道其他方法。反转字符串可以用split、reverse,或者循环。统计字符出现次数可以用对象记录。回文判断也是一个典型问题,比如用双指针。然后是两数之和,哈希表解决。合并有序数组,双指针从后往前。链表的话,反转链表是经典题。二叉树的最大深度,递归或者层序遍历。快速排序的实现,分治思想。括号匹配,用栈来处理。斐波那契数列,递归和迭代两种方法。还有最近的LRU缓存,用Map或者对象加链表。另外,函数柯里化、防抖节流这些前端特定问题也要考虑进去。
需要注意用户可能需要的是题目和答案的示例,所以每个问题要给出一个例子,然后给出解答。解答最好用JavaScript,因为前端主要用这个。另外,要确保代码正确,比如反转链表的时候指针操作正确,递归的终止条件等。可能还需要解释一下解题思路,让读者更容易理解。
还要考虑用户的水平,可能是正在准备面试的新手,所以解释要简洁明了,代码注释可能也有帮助。同时,例题的难度要适中,不要太复杂,但也要覆盖常见的考点。比如两数之和和合并有序数组都是数组操作的常见题,而反转链表和二叉树深度则是数据结构的基础。
有没有可能漏掉什么常见题目?比如有效的括号、最长子串、爬楼梯问题?或者事件循环相关的,但事件循环更多是概念题。另外,手写Promise.all或者深拷贝也可能出现,但这些可能属于编码题而非算法题。不过用户特别提到算法题,所以可能集中在数据结构与算法部分。
总之,我需要整理出大约10个左右的常见问题,每个问题给出题目描述、示例和解答代码,并用中文解释。确保覆盖数组、字符串、链表、树、排序、动态规划、实际应用等类型,这样用户可以得到全面的信息。以下是</think>前端面试中常见的算法题类型及例题与解答,涵盖基础数据结构、字符串处理、实际应用等场景:
---
### 一、数组与字符串处理
#### 1. 数组去重
**题目**:实现一个函数,去除数组中的重复元素。
**示例**:`[1, 2, 2, 3]` → `[1, 2, 3]`
**答案**:
```javascript
function unique(arr) {
return [...new Set(arr)];
// 或传统方法:return arr.filter((item, index) => arr.indexOf(item) === index);
}
```
#### 2. 反转字符串
**题目**:将字符串反转,要求空间复杂度 O(1)(原地修改)。
**示例**:`"hello"` → `"olleh"`
**答案**:
```javascript
function reverseString(s) {
return s.split('').reverse().join('');
// 或双指针:s = s.split(''); let left=0, right=s.length-1; while(left<right) { [s[left], s[right]] = [s[right], s[left]]; left++; right--; } return s.join('');
}
```
---
### 二、常见数据结构
#### 3. 反转链表
**题目**:反转单链表。
**示例**:`1 -> 2 -> 3` → `3 -> 2 -> 1`
**答案**:
```javascript
function reverseList(head) {
let prev = null, curr = head;
while (curr) {
const next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
#### 4. 有效的括号
**题目**:判断字符串中的括号是否有效闭合。
**示例**:`"()[]{}"` → `true`;`"(]"` → `false`
**答案**:
```javascript
function isValid(s) {
const stack = [];
const map = { '(': ')', '[': ']', '{': '}' };
for (let char of s) {
if (map[char]) stack.push(char);
else if (map[stack.pop()] !== char) return false;
}
return stack.length === 0;
}
```
---
### 三、树与递归
#### 5. 二叉树的最大深度
**题目**:计算二叉树的最大深度。
**示例**:
```
3
/ \
9 20
/ \
15 7
```
输出:`3`
**答案**:
```javascript
function maxDepth(root) {
if (!root) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
```
---
### 四、双指针与排序
#### 6. 合并两个有序数组
**题目**:将两个有序数组合并到第一个数组中(假设第一个数组有足够空间)。
**示例**:`nums1 = [1,2,3,0,0,0], m=3; nums2 = [2,5,6], n=3` → `[1,2,2,3,5,6]`
**答案**:
```javascript
function merge(nums1, m, nums2, n) {
let p1 = m - 1, p2 = n - 1, p = m + n - 1;
while (p2 >= 0) {
nums1[p--] = (nums1[p1] > nums2[p2]) ? nums1[p1--] : nums2[p2--];
}
}
```
---
### 五、动态规划
#### 7. 爬楼梯
**题目**:每次可以爬 1 或 2 阶台阶,求爬到第 n 阶的方法数。
**示例**:`n=3` → `3`(1+1+1, 1+2, 2+1)
**答案**:
```javascript
function climbStairs(n) {
if (n <= 2) return n;
let a = 1, b = 2;
for (let i = 3; i <= n; i++) {
[a, b] = [b, a + b];
}
return b;
}
```
---
### 六、实际应用类
#### 8. 手写防抖函数(Debounce)
**题目**:实现一个防抖函数,限制函数在短时间内频繁触发。
**答案**:
```javascript
function debounce(fn, delay) {
let timer = null;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
```
---
### 七、高频进阶题
#### 9. LRU 缓存机制
**题目**:设计一个 LRU 缓存,支持 `get` 和 `put` 操作(使用 `Map` 实现)。
**答案**:
```javascript
class LRUCache {
constructor(capacity) {
this.cache = new Map();
this.capacity = capacity;
}
get(key) {
if (!this.cache.has(key)) return -1;
const val = this.cache.get(key);
this.cache.delete(key);
this.cache.set(key, val);
return val;
}
put(key, value) {
if (this.cache.has(key)) this.cache.delete(key);
this.cache.set(key, value);
if (this.cache.size > this.capacity) {
this.cache.delete(this.cache.keys().next().value);
}
}
}
```
---
以上题目覆盖了数组、字符串、链表、树、双指针、动态规划等常见考点,实际面试中可能结合具体场景变形出现。建议理解思路后手写代码,并注意边界条件处理。
阅读全文
相关推荐












