版本号排序。
// sort方法的回调 + 循环迭代法
function compareVersions(v1, v2) {
const parts1 = v1.split('.').map(Number);
const parts2 = v2.split('.').map(Number);
const length = Math.max(parts1.length, parts2.length);
for (let i = 0; i < length; i++) {
const num1 = parts1[i] || 0;
const num2 = parts2[i] || 0;
if (num1 > num2) return 1;
if (num1 < num2) return -1;
}
return 0;
}
function sortVersions(versions) {
return versions.sort(compareVersions);
}
const versions = ['1.45', '3.3.3.3.3', '1.5.0', '6'];
const sortedVersions = sortVersions(versions);
console.log(sortedVersions); // ['1.5.0', '1.45', '3.3.3.3.3', '6']
分别找出两个数组的特有元素。
function findDiffrence(nums1, nums2) {
const set1 = new Set(nums1);
const set2 = new Set(nums2);
for (const key of set1) {
if (set2.has(key)) {
set1.delete(key);
set2.delete(key);
}
}
return {res1: [...set1], res2: [...set2]};
}
arr1 = [1,2,2,6,5,4];
arr2 = [3,3,8,6,5,4];
findDiffrence(arr1, arr2); // {res1: [1, 2], res2: [3, 8]}
输入:实现findObj函数,接收两个参数,例如:'a.b.c.d.e', a:{b:{c:{d:{e:'你好'}}}};
输出:你好。
// 循环迭代:只有递,没有归
function findObj(path, obj) {
const keys = path.split('.');
let current = obj;
for (const key of keys) {
if (current[key] !== undefined) {
current = current[key];
} else {
return undefined;
}
}
return current;
}
斐波那契数列。
// 动态规划:解决具有重叠子问题的优化问题,且不包含回溯的过程
// 标准动态规划
function fibonacci(n) {
if (n === 1 || n === 2) return 1;
// 初始化dp表,用于存储子问题的解
const dp = new Array(n + 1).fill(-1);
// 初始状态:从较小子问题逐步求解较大问题
dp[1] = 1;
dp[2] = 1;
// 状态转移:从较小子问题逐步求解较大子问题
for (let i = 3; i <= n; i++) {
dp[i] = dp[i - 2] + dp[i - 1];
}
return dp[n];
}
// 空间优化后的动态规划
function fibonacci(n) {
if (n === 1 || n === 2) return 1;
let p = 1, q = 1;
for (let i = 3; i <= n; i++) {
const r = p + q;
p = q;
q = r;
}
return r;
}
// 递归:先往下递,后向上归
function fibonacci(n) {
if (n <= 0) {
return 0;
} else if (n === 1) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
let n = 10;
console.log(`斐波那契数列的第 ${n} 项是 ${fibonacci(n)}`);