返回

前端高手必备!面试常见算法问题实战解析

前端

前端工程师在面试中常被问及一些算法问题,这些问题考察应聘者的逻辑思维能力和编码技能。为了帮助大家备战面试,本文将深入探讨前端面试中常见的算法问题,包括模拟实现红绿灯、二分法、冒泡排序和快速排序。

模拟实现红绿灯

问题 模拟实现一个红绿灯系统,红灯持续3秒,绿灯持续2秒,黄灯持续1秒。

实现步骤:

  1. 定义红、黄、绿三种颜色的持续时间(以毫秒为单位)。
  2. 使用 setInterval 函数创建三个定时器,分别控制红、黄、绿灯的闪烁。
  3. 设置一个全局变量 currentLight,初始值为 "red"。
  4. 在每个定时器中,根据 currentLight 的值显示相应的灯的颜色。
  5. 定时器结束后,将 currentLight 的值切换为下一个颜色。

代码示例:

const redDuration = 3000;
const yellowDuration = 1000;
const greenDuration = 2000;

let currentLight = "red";

setInterval(() => {
  if (currentLight === "red") {
    console.log("Red light on");
    currentLight = "yellow";
    setTimeout(() => {
      console.log("Yellow light on");
      currentLight = "green";
      setTimeout(() => {
        console.log("Green light on");
        currentLight = "red";
      }, greenDuration);
    }, yellowDuration);
  }
}, redDuration);

二分法

问题: 在有序数组中找到一个指定元素。

实现步骤:

  1. 定义一个左指针和一个右指针,分别指向数组的第一个元素和最后一个元素。
  2. 计算数组的中点索引。
  3. 将中点元素与要查找的元素进行比较。
  4. 如果中点元素等于要查找的元素,则返回中点索引。
  5. 如果中点元素大于要查找的元素,则将右指针更新为中点索引减1。
  6. 如果中点元素小于要查找的元素,则将左指针更新为中点索引加1。
  7. 重复步骤2-6,直到左指针大于或等于右指针。
  8. 如果此时右指针为负数,则返回 -1(表示未找到元素)。

代码示例:

function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    if (arr[mid] === target) {
      return mid;
    } else if (arr[mid] > target) {
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }

  return -1;
}

冒泡排序

问题: 将数组中的元素从小到大排序。

实现步骤:

  1. 遍历数组,比较相邻元素。
  2. 如果前一个元素大于后一个元素,则交换它们的位置。
  3. 重复步骤2,直到数组中所有元素都按顺序排列。

代码示例:

function bubbleSort(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        const temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }

  return arr;
}

快速排序

问题描述: 将数组中的元素从小到大排序。

实现步骤:

  1. 选择一个基准元素。
  2. 将数组中的元素划分为两部分:小于基准元素的部分和小于基准元素的部分。
  3. 对两部分递归应用快速排序。

代码示例:

function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  const pivot = arr[0];
  const left = [];
  const right = [];

  for (let i = 1; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }

  return [...quickSort(left), pivot, ...quickSort(right)];
}