在前端面试中,算法题已成为考察候选人解决问题能力的重要部分。本文精选了 10 道常见的前端算法面试题,涵盖了字符串处理、数组操作、排序与搜索等多方面知识点,并给出了详细解析和代码实现。
1. 两数之和
题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个数,返回它们的索引。
解法:
function twoSum(nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
if (map.has(complement)) {
return [map.get(complement), i];
}
map.set(nums[i], i);
}
return [];
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
2. 无重复字符的最长子串
题目描述:给定一个字符串,找出其中不含有重复字符的最长子串的长度。
解法:
function lengthOfLongestSubstring(s) {
let maxLength = 0;
let left = 0;
const map = new Map();
for (let right = 0; right < s.length; right++) {
if (map.has(s[right]) && map.get(s[right]) >= left) {
left = map.get(s[right]) + 1;
}
map.set(s[right], right);
maxLength = Math.max(maxLength, right - left + 1);
}
return maxLength;
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
3. 反转字符串
题目描述:给定一个字符串,要求反转该字符串。
解法:
function reverseString(s) {
return s.split('').reverse().join('');
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
4. 判断回文字符串
题目描述:给定一个字符串,判断其是否为回文串(正序与倒序相同)。
解法:
function isPalindrome(s) {
const str = s.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
let left = 0, right = str.length - 1;
while (left < right) {
if (str[left] !== str[right]) return false;
left++;
right--;
}
return true;
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
5. 合并两个有序数组
题目描述:将两个有序数组合并为一个有序数组。
解法:
function mergeSortedArrays(arr1, arr2) {
let merged = [];
let i = 0, j = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
merged.push(arr1[i++]);
} else {
merged.push(arr2[j++]);
}
}
return merged.concat(arr1.slice(i)).concat(arr2.slice(j));
}
复杂度分析:
- 时间复杂度:O(m + n)
- 空间复杂度:O(m + n)
6. 数组去重
题目描述:实现一个方法,去除数组中重复的元素。
解法:
function uniqueArray(arr) {
return Array.from(new Set(arr));
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
7. 斐波那契数列
题目描述:实现一个函数,计算第 n 个斐波那契数。
解法:
function fibonacci(n) {
if (n <= 1) return n;
let a = 0, b = 1;
for (let i = 2; i <= n; i++) {
[a, b] = [b, a + b];
}
return b;
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
8. 二分查找
题目描述:实现一个二分查找算法。
解法:
function binarySearch(arr, target) {
let left = 0, right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
复杂度分析:
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
9. 树的最大深度
题目描述:给定一个二叉树,求其最大深度。
解法:
function maxDepth(root) {
if (!root) return 0;
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(h)(h 为树的高度)
10. 括号有效性判断
题目描述:判断给定的括号字符串是否有效。
解法:
function isValid(s) {
const stack = [];
const map = {')': '(', '}': '{', ']': '['};
for (const char of s) {
if (char in map) {
if (stack.pop() !== map[char]) return false;
} else {
stack.push(char);
}
}
return stack.length === 0;
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
总结
掌握这些经典的前端算法题不仅能帮助你在面试中脱颖而出,更能提升你在日常开发中解决复杂问题的能力。希望本文对你有所帮助,祝你在前端求职之路上一帆风顺!