前端基础算法题

182 阅读3分钟

前端开发的算法面试题通常会测试候选人在数据结构、算法逻辑和编码能力方面的基础。以下是一些常见的前端基础算法面试题,以及它们的解题思路和相关代码示例。

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;
}

总结

这些算法题目涉及了基础数据结构和算法的应用,是前端面试中常见的考察内容。在面试时,除了要能够解决问题,还需要清晰地表达自己的思路,优化代码并考虑边界情况。希望这些示例能帮助你更好地准备面试!