2023前端常见的算法题都有哪些?

心已赠人 2023-09-24 23:37 122阅读 0赞

以下是20个常见的前端算法题,每个算法题都包含代码解析。

1. 反转字符串

题目描述

将给定字符串中的字符顺序反转。

代码解析

  1. function reverseString(str) {
  2. return str.split('').reverse().join('');
  3. }

2. 阶乘

题目描述

计算一个整数的阶乘。

代码解析

  1. function factorial(num) {
  2. if (num === 0) {
  3. return 1;
  4. } else {
  5. return num * factorial(num - 1);
  6. }
  7. }

3. 斐波那契数列

题目描述

输出斐波那契数列中的前 n 项。

代码解析

  1. function fibonacci(n) {
  2. if (n === 1) {
  3. return [0, 1];
  4. } else {
  5. var arr = fibonacci(n - 1);
  6. arr.push(arr[arr.length - 1] + arr[arr.length - 2]);
  7. return arr;
  8. }
  9. }

4. 翻转二叉树

题目描述

翻转一棵二叉树。

代码解析

  1. function invertTree(root) {
  2. if (root !== null) {
  3. var left = invertTree(root.left);
  4. var right = invertTree(root.right);
  5. root.left = right;
  6. root.right = left;
  7. }
  8. return root;
  9. }

5. 数组去重

题目描述

将一个数组中重复的元素去掉。

代码解析

  1. function uniqueArray(arr) {
  2. var result = [];
  3. for (var i = 0; i < arr.length; i++) {
  4. if (result.indexOf(arr[i]) === -1) {
  5. result.push(arr[i]);
  6. }
  7. }
  8. return result;
  9. }

6. 判断回文字符串

题目描述

判断一个字符串是否是回文字符串。

代码解析

  1. function isPalindrome(str) {
  2. var reversedStr = str.split('').reverse().join('');
  3. return str === reversedStr;
  4. }

7. 二分查找

题目描述

在一个已排序的数组中查找一个元素。

代码解析

  1. function binarySearch(arr, target) {
  2. var left = 0;
  3. var right = arr.length - 1;
  4. while (left <= right) {
  5. var mid = Math.floor((left + right) / 2);
  6. if (arr[mid] === target) {
  7. return mid;
  8. } else if (arr[mid] < target) {
  9. left = mid + 1;
  10. } else {
  11. right = mid - 1;
  12. }
  13. }
  14. return -1;
  15. }

8. 冒泡排序

题目描述

将一个数组按照从小到大的顺序排列。

代码解析

  1. function bubbleSort(arr) {
  2. for (var i = 0; i < arr.length - 1; i++) {
  3. for (var j = 0; j < arr.length - i - 1; j++) {
  4. if (arr[j] > arr[j + 1]) {
  5. var temp = arr[j];
  6. arr[j] = arr[j + 1];
  7. arr[j + 1] = temp;
  8. }
  9. }
  10. }
  11. return arr;
  12. }

9. 快速排序

题目描述

将一个数组按照从小到大的顺序排列。

代码解析

  1. function quickSort(arr) {
  2. if (arr.length <= 1) {
  3. return arr;
  4. }
  5. var pivotIndex = Math.floor(arr.length / 2);
  6. var pivot = arr.splice(pivotIndex, 1)[0];
  7. var left = [];
  8. var right = [];
  9. for (var i = 0; i < arr.length; i++) {
  10. if (arr[i] < pivot) {
  11. left.push(arr[i]);
  12. } else {
  13. right.push(arr[i]);
  14. }
  15. }
  16. return quickSort(left).concat([pivot], quickSort(right));
  17. }

10. 计数排序

题目描述

将一个数组按照从小到大的顺序排列。

代码解析

  1. function countingSort(arr) {
  2. var max = arr[0];
  3. var min = arr[0];
  4. for (var i = 1; i < arr.length; i++) {
  5. if (arr[i] > max) {
  6. max = arr[i];
  7. }
  8. if (arr[i] < min) {
  9. min = arr[i];
  10. }
  11. }
  12. var count = [];
  13. for (var j = min; j <= max; j++) {
  14. count[j] = 0;
  15. }
  16. for (var k = 0; k < arr.length; k++) {
  17. count[arr[k]]++;
  18. }
  19. var result = [];
  20. for (var m = min; m <= max; m++) {
  21. while (count[m] > 0) {
  22. result.push(m);
  23. count[m]--;
  24. }
  25. }
  26. return result;
  27. }

11. 求最大公约数

题目描述

求两个整数的最大公约数。

代码解析

  1. function gcd(num1, num2) {
  2. if (num2 === 0) {
  3. return num1;
  4. }
  5. return gcd(num2, num1 % num2);
  6. }

12. 斐波那契数列(优化版)

题目描述

输出斐波那契数列的第 n 项。

代码解析

  1. function fibonacci(n) {
  2. var arr = [0, 1];
  3. for (var i = 2; i <= n; i++) {
  4. arr[i] = arr[i - 1] + arr[i - 2];
  5. }
  6. return arr[n];
  7. }

13. 编辑距离

题目描述

计算两个字符串之间的编辑距离。

代码解析

  1. function editDistance(str1, str2) {
  2. var m = str1.length;
  3. var n = str2.length;
  4. var dp = [];
  5. for (var i = 0; i <= m; i++) {
  6. dp[i] = [];
  7. for (var j = 0; j <= n; j++) {
  8. if (i === 0) {
  9. dp[i][j] = j;
  10. } else if (j === 0) {
  11. dp[i][j] = i;
  12. } else if (str1[i - 1] === str2[j - 1]) {
  13. dp[i][j] = dp[i - 1][j - 1];
  14. } else {
  15. dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
  16. }
  17. }
  18. }
  19. return dp[m][n];
  20. }

14. 爬楼梯

题目描述

有一个 n 级的楼梯,每次可以爬一级或两级,问有多少种爬楼梯的方案。

代码解析

  1. function climbStairs(n) {
  2. if (n === 1) {
  3. return 1;
  4. } else if (n === 2) {
  5. return 2;
  6. } else {
  7. var arr = [1, 2];
  8. for (var i = 2; i < n; i++) {
  9. arr[i] = arr[i - 1] + arr[i - 2];
  10. }
  11. return arr[n - 1];
  12. }
  13. }

15. 最长递增子序列

题目描述

求一个数组中最长递增子序列的长度。

代码解析

  1. function longestIncreasingSubsequence(arr) {
  2. var dp = [];
  3. for (var i = 0; i < arr.length; i++) {
  4. dp[i] = 1;
  5. for (var j = 0; j < i; j++) {
  6. if (arr[j] < arr[i]) {
  7. dp[i] = Math.max(dp[i], dp[j] + 1);
  8. }
  9. }
  10. }
  11. return Math.max(...dp);
  12. }

16. 最长公共子序列

题目描述

求两个字符串的最长公共子序列。

代码解析

  1. function longestCommonSubsequence(str1, str2) {
  2. var m = str1.length;
  3. var n = str2.length;
  4. var dp = [];
  5. for (var i = 0; i <= m; i++) {
  6. dp[i] = [];
  7. for (var j = 0; j <= n; j++) {
  8. if (i === 0 || j === 0) {
  9. dp[i][j] = 0;
  10. } else if (str1[i - 1] === str2[j - 1]) {
  11. dp[i][j] = dp[i - 1][j - 1] + 1;
  12. } else {
  13. dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
  14. }
  15. }
  16. }
  17. return dp[m][n];
  18. }

17. 最长回文子串

题目描述

求一个字符串中最长的回文子串。

代码解析

  1. function longestPalindrome(str) {
  2. var n = str.length;
  3. var dp = [];
  4. var start = 0;
  5. var maxLen = 1;
  6. for (var i = 0; i < n; i++) {
  7. dp[i] = [];
  8. dp[i][i] = true;
  9. }
  10. for (var j = 1; j < n; j++) {
  11. for (var i = 0; i < j; i++) {
  12. if (str[i] === str[j] && (j - i <= 2 || dp[i + 1][j - 1])) {
  13. dp[i][j] = true;
  14. if (j - i + 1 > maxLen) {
  15. maxLen = j - i + 1;
  16. start = i;
  17. }
  18. } else {
  19. dp[i][j] = false;
  20. }
  21. }
  22. }
  23. return str.substring(start, start + maxLen);
  24. }

18. 最小路径和

题目描述

求一个二维数组中从左上角到右下角的最小路径和。

代码解析

  1. function minPathSum(grid) {
  2. var m = grid.length;
  3. var n = grid[0].length;
  4. for (var i = 0; i < m; i++) {
  5. for (var j = 0; j < n; j++) {
  6. if (i === 0 && j === 0) {
  7. continue;
  8. } else if (i === 0) {
  9. grid[i][j] += grid[i][j - 1];
  10. } else if (j === 0) {
  11. grid[i][j] += grid[i - 1][j];
  12. } else {
  13. grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
  14. }
  15. }
  16. }
  17. return grid[m - 1][n - 1];
  18. }

19. 最长无重复子串

题目描述

求一个字符串中最长的无重复子串。

代码解析

  1. function longestSubstringWithoutRepeatingCharacters(str) {
  2. var n = str.length;
  3. var set = new Set();
  4. var maxLength = 0;
  5. var i = 0;
  6. var j = 0;
  7. while (i < n && j < n) {
  8. if (!set.has(str[j])) {
  9. set.add(str[j++]);
  10. maxLength = Math.max(maxLength, j - i);
  11. } else {
  12. set.delete(str[i++]);
  13. }
  14. }
  15. return maxLength;
  16. }

20. 字符串转换整数

题目描述

将一个字符串转换成整数。

代码解析

  1. function stringToInteger(str) {
  2. var sign = 1;
  3. var i = 0;
  4. var result = 0;
  5. while (str[i] === ' ') {
  6. i++;
  7. }
  8. if (str[i] === '-' || str[i] === '+') {
  9. sign = str[i] === '-' ? -1 : 1;
  10. i++;
  11. }
  12. while (i < str.length) {
  13. var digit = str.charCodeAt(i) - 48;
  14. if (digit < 0 || digit > 9) {
  15. break;
  16. }
  17. result = result * 10 + digit;
  18. i++;
  19. }
  20. result *= sign;
  21. if (result < -2147483648) {
  22. return -214748364

发表评论

表情:
评论列表 (有 0 条评论,122人围观)

还没有评论,来说两句吧...

相关阅读

    相关 常见测试技术哪些

    测试技术是用于评估系统或组件的方法,目的是发现它是否满足给定的要求。系统测试有助于识别缺口、错误,或与实际需求不同的任何类型的缺失需求。测试技术是测试团队根据给定的需求评估已开