以下是20个常见的前端算法题,每个算法题都包含代码解析。
将给定字符串中的字符顺序反转。
function reverseString(str) {
return str.split('').reverse().join('');
}
计算一个整数的阶乘。
function factorial(num) {
if (num === 0) {
return 1;
} else {
return num * factorial(num - 1);
}
}
输出斐波那契数列中的前 n 项。
function fibonacci(n) {
if (n === 1) {
return [0, 1];
} else {
var arr = fibonacci(n - 1);
arr.push(arr[arr.length - 1] + arr[arr.length - 2]);
return arr;
}
}
翻转一棵二叉树。
function invertTree(root) {
if (root !== null) {
var left = invertTree(root.left);
var right = invertTree(root.right);
root.left = right;
root.right = left;
}
return root;
}
将一个数组中重复的元素去掉。
function uniqueArray(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) === -1) {
result.push(arr[i]);
}
}
return result;
}
判断一个字符串是否是回文字符串。
function isPalindrome(str) {
var reversedStr = str.split('').reverse().join('');
return str === reversedStr;
}
在一个已排序的数组中查找一个元素。
function binarySearch(arr, target) {
var left = 0;
var right = arr.length - 1;
while (left <= right) {
var 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;
}
将一个数组按照从小到大的顺序排列。
function bubbleSort(arr) {
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
将一个数组按照从小到大的顺序排列。
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
}
将一个数组按照从小到大的顺序排列。
function countingSort(arr) {
var max = arr[0];
var min = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
var count = [];
for (var j = min; j <= max; j++) {
count[j] = 0;
}
for (var k = 0; k < arr.length; k++) {
count[arr[k]]++;
}
var result = [];
for (var m = min; m <= max; m++) {
while (count[m] > 0) {
result.push(m);
count[m]--;
}
}
return result;
}
求两个整数的最大公约数。
function gcd(num1, num2) {
if (num2 === 0) {
return num1;
}
return gcd(num2, num1 % num2);
}
输出斐波那契数列的第 n 项。
function fibonacci(n) {
var arr = [0, 1];
for (var i = 2; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
计算两个字符串之间的编辑距离。
function editDistance(str1, str2) {
var m = str1.length;
var n = str2.length;
var dp = [];
for (var i = 0; i <= m; i++) {
dp[i] = [];
for (var j = 0; j <= n; j++) {
if (i === 0) {
dp[i][j] = j;
} else if (j === 0) {
dp[i][j] = i;
} else if (str1[i - 1] === str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
}
}
}
return dp[m][n];
}
有一个 n 级的楼梯,每次可以爬一级或两级,问有多少种爬楼梯的方案。
function climbStairs(n) {
if (n === 1) {
return 1;
} else if (n === 2) {
return 2;
} else {
var arr = [1, 2];
for (var i = 2; i < n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n - 1];
}
}
求一个数组中最长递增子序列的长度。
function longestIncreasingSubsequence(arr) {
var dp = [];
for (var i = 0; i < arr.length; i++) {
dp[i] = 1;
for (var j = 0; j < i; j++) {
if (arr[j] < arr[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
return Math.max(...dp);
}
求两个字符串的最长公共子序列。
function longestCommonSubsequence(str1, str2) {
var m = str1.length;
var n = str2.length;
var dp = [];
for (var i = 0; i <= m; i++) {
dp[i] = [];
for (var j = 0; j <= n; j++) {
if (i === 0 || j === 0) {
dp[i][j] = 0;
} else if (str1[i - 1] === str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
求一个字符串中最长的回文子串。
function longestPalindrome(str) {
var n = str.length;
var dp = [];
var start = 0;
var maxLen = 1;
for (var i = 0; i < n; i++) {
dp[i] = [];
dp[i][i] = true;
}
for (var j = 1; j < n; j++) {
for (var i = 0; i < j; i++) {
if (str[i] === str[j] && (j - i <= 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
if (j - i + 1 > maxLen) {
maxLen = j - i + 1;
start = i;
}
} else {
dp[i][j] = false;
}
}
}
return str.substring(start, start + maxLen);
}
求一个二维数组中从左上角到右下角的最小路径和。
function minPathSum(grid) {
var m = grid.length;
var n = grid[0].length;
for (var i = 0; i < m; i++) {
for (var j = 0; j < n; j++) {
if (i === 0 && j === 0) {
continue;
} else if (i === 0) {
grid[i][j] += grid[i][j - 1];
} else if (j === 0) {
grid[i][j] += grid[i - 1][j];
} else {
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
}
}
}
return grid[m - 1][n - 1];
}
求一个字符串中最长的无重复子串。
function longestSubstringWithoutRepeatingCharacters(str) {
var n = str.length;
var set = new Set();
var maxLength = 0;
var i = 0;
var j = 0;
while (i < n && j < n) {
if (!set.has(str[j])) {
set.add(str[j++]);
maxLength = Math.max(maxLength, j - i);
} else {
set.delete(str[i++]);
}
}
return maxLength;
}
将一个字符串转换成整数。
function stringToInteger(str) {
var sign = 1;
var i = 0;
var result = 0;
while (str[i] === ' ') {
i++;
}
if (str[i] === '-' || str[i] === '+') {
sign = str[i] === '-' ? -1 : 1;
i++;
}
while (i < str.length) {
var digit = str.charCodeAt(i) - 48;
if (digit < 0 || digit > 9) {
break;
}
result = result * 10 + digit;
i++;
}
result *= sign;
if (result < -2147483648) {
return -214748364