返回
前端高手必备!面试常见算法问题实战解析
前端
2024-01-21 09:31:24
前端工程师在面试中常被问及一些算法问题,这些问题考察应聘者的逻辑思维能力和编码技能。为了帮助大家备战面试,本文将深入探讨前端面试中常见的算法问题,包括模拟实现红绿灯、二分法、冒泡排序和快速排序。
模拟实现红绿灯
问题 模拟实现一个红绿灯系统,红灯持续3秒,绿灯持续2秒,黄灯持续1秒。
实现步骤:
- 定义红、黄、绿三种颜色的持续时间(以毫秒为单位)。
- 使用
setInterval
函数创建三个定时器,分别控制红、黄、绿灯的闪烁。 - 设置一个全局变量
currentLight
,初始值为 "red"。 - 在每个定时器中,根据
currentLight
的值显示相应的灯的颜色。 - 定时器结束后,将
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。
- 如果中点元素小于要查找的元素,则将左指针更新为中点索引加1。
- 重复步骤2-6,直到左指针大于或等于右指针。
- 如果此时右指针为负数,则返回 -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;
}
冒泡排序
问题: 将数组中的元素从小到大排序。
实现步骤:
- 遍历数组,比较相邻元素。
- 如果前一个元素大于后一个元素,则交换它们的位置。
- 重复步骤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;
}
快速排序
问题描述: 将数组中的元素从小到大排序。
实现步骤:
- 选择一个基准元素。
- 将数组中的元素划分为两部分:小于基准元素的部分和小于基准元素的部分。
- 对两部分递归应用快速排序。
代码示例:
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)];
}