面试算法(1)

9 阅读2分钟

版本号排序。

// 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)}`);