前端开发的算法面试题通常会测试候选人在数据结构、算法逻辑和编码能力方面的基础。以下是一些常见的前端基础算法面试题,以及它们的解题思路和相关代码示例。
1. 数组去重
题目:给定一个数组,返回一个去重后的新数组。
思路:
- 可以使用 Set 来去重。
- 或者使用 filter 方法结合 indexOf 来去重。
代码示例:
javascript
// 使用 Set
function uniqueArray(arr) {
return [...new Set(arr)];
}
// 使用 filter
function uniqueArray(arr) {
return arr.filter((value, index, self) => self.indexOf(value) === index);
}
2. 反转字符串
题目:给定一个字符串,返回反转后的字符串。
思路:
- 将字符串转换为数组,反转数组,然后再转换回字符串。
代码示例:
javascript
function reverseString(str) {
return str.split('').reverse().join('');
}
3. 判断回文
题目:判断一个字符串是否为回文字符串(正着读和反着读都相同)。
思路:
- 将字符串反转,然后与原字符串比较。
代码示例:
javascript
function isPalindrome(str) {
return str === str.split('').reverse().join('');
}
4. 找出数组中的最大值和最小值
题目:给定一个数组,找出其中的最大值和最小值。
思路:
- 使用 Math.max 和 Math.min 方法。
代码示例:
javascript
function findMinMax(arr) {
const max = Math.max(...arr);
const min = Math.min(...arr);
return { max, min };
}
5. 斐波那契数列
题目:实现一个函数,返回斐波那契数列的第 n 项。
思路:
- 可以使用递归或迭代的方式计算。
代码示例:
javascript
// 递归
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 迭代
function fibonacci(n) {
let a = 0, b = 1;
for (let i = 2; i <= n; i++) {
[a, b] = [b, a + b];
}
return b;
}
6. 字符串全排列
题目:给定一个字符串,返回所有可能的全排列。
思路:
- 使用递归生成全排列。
代码示例:
javascript
function permute(str) {
const result = [];
const backtrack = (path, options) => {
if (options.length === 0) {
result.push(path);
return;
}
for (let i = 0; i < options.length; i++) {
const newPath = path + options[i];
const newOptions = options.slice(0, i).concat(options.slice(i + 1));
backtrack(newPath, newOptions);
}
};
backtrack('', str.split(''));
return result;
}
7. 合并两个有序数组
题目:给定两个有序数组,合并成一个新的有序数组。
思路:
- 使用两个指针,分别指向两个数组,逐个比较元素,构建合并后的数组。
代码示例:
javascript
function mergeSortedArrays(arr1, arr2) {
let result = [];
let i = 0, j = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
result.push(arr1[i]);
i++;
} else {
result.push(arr2[j]);
j++;
}
}
return result.concat(arr1.slice(i)).concat(arr2.slice(j));
}
8. 寻找数组中的重复元素
题目:给定一个数组,找出其中的重复元素。
思路:
- 可以使用 Set 来存储已遍历的元素,如果发现已经存在于 Set 中,则为重复元素。
代码示例:
javascript
function findDuplicates(arr) {
const seen = new Set();
const duplicates = [];
for (const num of arr) {
if (seen.has(num)) {
duplicates.push(num);
} else {
seen.add(num);
}
}
return duplicates;
}
9. 二分查找
题目:实现一个函数,使用二分查找查找一个元素在有序数组中的位置。
思路:
- 使用两个指针,分别指向数组的开始和结束,逐步缩小范围。
代码示例:
javascript
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) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 未找到
}
10. 括号匹配
题目:检查字符串中的括号是否匹配。
思路:
- 使用栈来存储左括号,当遇到右括号时检查栈顶元素。
代码示例:
javascript
function isValidParentheses(s) {
const stack = [];
const mapping = { '(': ')', '{': '}', '[': ']' };
for (const char of s) {
if (char in mapping) {
stack.push(char);
} else {
if (stack.length === 0 || mapping[stack.pop()] !== char) {
return false;
}
}
}
return stack.length === 0;
}
总结
这些算法题目涉及了基础数据结构和算法的应用,是前端面试中常见的考察内容。在面试时,除了要能够解决问题,还需要清晰地表达自己的思路,优化代码并考虑边界情况。希望这些示例能帮助你更好地准备面试!