返回

斩获前端面试官的芳心!LeetCode轻松搞定150道面试题——简单题(下)

前端

各位前端开发工程师们,你们还在为如何应对前端面试而发愁吗?不用担心,LeetCode 将为您提供帮助!本文精选了 LeetCode 上最常见的 150 道前端面试题,涵盖了简单题、中等题和困难题三个难度级别。本文将重点介绍简单题(下),提供详细的解题思路和代码示例,帮助您轻松应对前端面试。

LeetCode 是一个非常流行的在线算法学习和刷题平台,它提供了大量的算法题和详细的解题思路。如果您想提高自己的算法能力,LeetCode 是一个非常好的选择。

本文精选的 150 道前端面试题,都是由资深的前端工程师精心挑选出来的。这些题目涵盖了前端开发的各个方面,包括 JavaScript、HTML、CSS、算法和数据结构。如果您能掌握这些题目,那么您在前端面试中一定会脱颖而出。

45. 136. 只出现一次的数字

题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的元素。

解题思路:
可以使用异或运算来解决这个问题。异或运算的性质是,相同的数字异或为 0,不同的数字异或为 1。因此,我们可以将数组中的所有数字异或一遍,得到的结果就是那个只出现一次的数字。

代码示例:

function singleNumber(nums) {
  let result = 0;
  for (let i = 0; i < nums.length; i++) {
    result ^= nums[i];
  }
  return result;
}

46. 169. 多数元素

题目:
给定一个大小为 n 的数组,找到出现次数超过 n/2 的元素。

解题思路:
可以使用摩尔投票法来解决这个问题。摩尔投票法的基本思想是,在数组中,如果某个元素出现次数超过 n/2,那么它一定出现在数组的前半部分和后半部分。因此,我们可以先将数组分成两半,然后在每一半中找到出现次数最多的元素。最后,如果这两个元素相等,那么它就是出现次数超过 n/2 的元素。

代码示例:

function majorityElement(nums) {
  let candidate = null;
  let count = 0;
  for (let i = 0; i < nums.length; i++) {
    if (count === 0) {
      candidate = nums[i];
      count = 1;
    } else if (candidate === nums[i]) {
      count++;
    } else {
      count--;
    }
  }
  return candidate;
}

47. 206. 反转链表

题目:
反转一个单链表。

解题思路:
可以使用迭代或递归的方式来反转链表。迭代的方式是,从链表的头部开始,依次将每个节点的 next 指针指向它的前一个节点。递归的方式是,将链表的头部节点指向它的下一个节点,然后递归地反转剩下的链表。

代码示例(迭代):

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

代码示例(递归):

function reverseList(head) {
  if (!head || !head.next) {
    return head;
  }
  let newHead = reverseList(head.next);
  head.next.next = head;
  head.next = null;
  return newHead;
}

48. 268. 丢失的数字

题目描述:
给定一个包含 0, 1, 2, ..., n 的数组,找到丢失的数字。

解题思路:
可以使用异或运算来解决这个问题。异或运算的性质是,相同的数字异或为 0,不同的数字异或为 1。因此,我们可以将数组中的所有数字异或一遍,然后将结果与 n 异或一遍,得到的结果就是丢失的数字。

代码示例:

function missingNumber(nums) {
  let result = nums.length;
  for (let i = 0; i < nums.length; i++) {
    result ^= nums[i];
    result ^= i;
  }
  return result;
}

49. 283. 移动零

题目描述:
给定一个数组,将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

解题思路:
可以使用双指针法来解决这个问题。双指针法的基本思想是,使用两个指针来遍历数组,一个指针指向当前的元素,另一个指针指向第一个遇到的 0。当当前指针指向一个非零元素时,将其与第一个遇到的 0 交换,然后将第一个遇到的 0 指针后移。

代码示例:

function moveZeroes(nums) {
  let j = 0;
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== 0) {
      nums[j] = nums[i];
      j++;
    }
  }
  for (let i = j; i < nums.length; i++) {
    nums[i] = 0;
  }
}

50. 344. 反转字符串

题目描述:
编写一个函数,反转字符串中的字符顺序。

解题思路:
可以使用双指针法来解决这个问题。双指针法的基本思想是,使用两个指针来遍历字符串,一个指针指向字符串的头部,另一个指针指向字符串的尾部。然后,将这两个指针指向的字符交换,并同时向中间移动。

代码示例:

function reverseString(s) {
  let left = 0;
  let right = s.length - 1;
  while (left < right) {
    let temp = s[left];
    s[left] = s[right];
    s[right] = temp;
    left++;
    right--;
  }
}

51. 349. 两个数组的交集

题目描述:
给定两个数组,找出它们的交集。

解题思路:
可以使用哈希表来解决这个问题。哈希表的