🔥「前端面试必杀技」10 道高频算法题深度解析,攻克 Offer 不再难!🔥

293 阅读3分钟

在前端面试中,算法题已成为考察候选人解决问题能力的重要部分。本文精选了 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)

总结

掌握这些经典的前端算法题不仅能帮助你在面试中脱颖而出,更能提升你在日常开发中解决复杂问题的能力。希望本文对你有所帮助,祝你在前端求职之路上一帆风顺!