返回

金三银四狂欢节:破解前端手写面试题的20道秘籍

前端

在金三银四的求职旺季,前端工程师们摩拳擦掌,跃跃欲试。然而,手写面试题往往是求职过程中一道难以逾越的坎坷。为了帮助各位求职者轻松应对,本文特地整理了20道常见前端手写面试题,涵盖字节、美团等大厂真题。

这些面试题既包含算法题,也包含编程题,考察范围广泛,难度由浅入深。文章将手把手拆解解题步骤,提供清晰的解题思路和示例代码,帮助求职者深入理解面试题的考点,提升解题能力。

无论是经验丰富的资深工程师,还是初出茅庐的应届毕业生,掌握这些面试题的解法,都将为你的求职之路添砖加瓦。让我们一起踏上破解面试题的征途,在金三银四的求职季脱颖而出!

1. 实现一个函数,判断一个字符串是否是回文字符串。

function isPalindrome(str) {
  return str === str.split('').reverse().join('');
}

2. 实现一个函数,找到一个数组中最长的子数组,该子数组的和为正数。

function maxSubArraySum(arr) {
  let maxSum = 0;
  let currentSum = 0;
  for (let i = 0; i < arr.length; i++) {
    currentSum += arr[i];
    if (currentSum < 0) {
      currentSum = 0;
    }
    maxSum = Math.max(maxSum, currentSum);
  }
  return maxSum;
}

3. 实现一个函数,判断一个二叉树是否是对称的。

function isSymmetric(root) {
  if (!root) {
    return true;
  }
  return isSymmetricHelper(root.left, root.right);
}

function isSymmetricHelper(left, right) {
  if (!left && !right) {
    return true;
  }
  if (!left || !right || left.val !== right.val) {
    return false;
  }
  return isSymmetricHelper(left.left, right.right) && isSymmetricHelper(left.right, right.left);
}

4. 实现一个函数,给定一个数组,找出数组中所有不重复的元素。

function findUniqueElements(arr) {
  return [...new Set(arr)];
}

5. 实现一个函数,给定一个字符串,找出字符串中最长的回文字符串。

function longestPalindrome(str) {
  let start = 0;
  let end = 0;
  for (let i = 0; i < str.length; i++) {
    const oddLength = expandAroundCenter(str, i, i);
    const evenLength = expandAroundCenter(str, i, i + 1);
    const currentLength = Math.max(oddLength, evenLength);
    if (currentLength > end - start) {
      start = i - (currentLength - 1) / 2;
      end = i + currentLength / 2;
    }
  }
  return str.substring(start, end + 1);

  function expandAroundCenter(str, left, right) {
    while (left >= 0 && right < str.length && str[left] === str[right]) {
      left--;
      right++;
    }
    return right - left - 1;
  }
}

6. 实现一个函数,给定一个数组,找出数组中三个元素的最大乘积。

function maxProduct(arr) {
  arr.sort((a, b) => a - b);
  const n = arr.length;
  return Math.max(arr[0] * arr[1] * arr[n - 1], arr[n - 1] * arr[n - 2] * arr[n - 3]);
}

7. 实现一个函数,给定一个字符串,判断字符串是否是有效的括号序列。

function isValidParentheses(str) {
  const stack = [];
  const pairs = { '(': ')', '{': '}', '[': ']' };
  for (let i = 0; i < str.length; i++) {
    if (str[i] in pairs) {
      stack.push(str[i]);
    } else {
      if (stack.length === 0 || pairs[stack.pop()] !== str[i]) {
        return false;
      }
    }
  }
  return stack.length === 0;
}

8. 实现一个函数,给定一个数组,找出数组中所有出现次数超过n/3的元素。

function findMajorityElements(arr, n) {
  const count = {};
  for (let i = 0; i < arr.length; i++) {
    count[arr[i]] = count[arr[i]] ? count[arr[i]] + 1 : 1;
  }
  const result = [];
  for (const key in count) {
    if (count[key] > arr.length / n) {
      result.push(parseInt(key));
    }
  }
  return result;
}

9. 实现一个函数,给定一个二叉树,找出二叉树的深度。

function maxDepth(root) {
  if (!root) {
    return 0;
  }
  return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}

10. 实现一个函数,给定一个链表,反转链表的顺序。

function reverseLinkedList(head) {
  let prev = null;
  let current = head;
  while (current) {
    const next = current.next;
    current.next = prev;
    prev = current;
    current = next;
  }
  return prev;
}

11. 实现一个函数,给定一个数组,找出数组中重复出现的元素。

function findDuplicateElements(arr) {
  const result = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr.indexOf(arr[i]) !== i) {
      result.push(arr[i]);
    }
  }
  return result;
}

12. 实现一个函数,给定一个字符串,找出字符串中不重复字符的最长子串。

function longestUniqueSubstring(str) {
  let start = 0;
  let end = 0;
  let maxLength = 0;
  const charMap = {};
  for (let i = 0; i < str.length; i++) {
    const char = str[i];
    if (charMap[char]) {
      start = Math.max(start, charMap[char]);
    }
    charMap[char] = i + 1;
    maxLength = Math.max(maxLength, i - start + 1);
  }
  return str.substring(start, start + maxLength);
}

13. 实现一个函数,给定一个数组,找出数组中所有可能的子集。

function findAllSubsets(arr) {
  if (!arr || arr.length === 0) {
    return [[]];
  }
  const result = [];
  const firstElement = arr[0];
  const subsets = findAllSubsets(arr.slice(1));
  for (let i = 0; i < subsets.length; i++) {
    result.push(subsets[i]);
    result.push([firstElement, ...subsets[i]]);
  }
  return result;
}

14. 实现一个函数,给定一个二叉树,找出二叉树的宽度。

function maxWidth(root) {
  if (!root) {
    return 0;
  }
  let queue = [root];
  let maxWidth = 0;
  while (queue.length >