20220320算法-比较版本大小

121 阅读1分钟

题目描述:比较两个版本号的大小,返回 -1, 0 , 1
例如:
输入: v1 = '5.19.20' , v2 = '5.9.20'
输出: 1

例如:
输入: v1 = '5.20' , v2 = '5.9.20'
输出: 1

例如:
输入: v1 = '5.001' , v2 = '5.01'
输出: 1

字符串拆分为数组,然后遍历比较大小

思路:将现有的字符串版本利用'.'拆分为数组,然后对比两个数组每项的大小

常规比较

function compareVersion(v1, v2) {
    const arr1 = v1.split('.');
    const arr2 = v2.split('.');
    const len = Math.max(arr1.length, arr2.length);
    
    // 将两个版本号位数对齐
    while(arr1.length < len) {
        arr1.push(0);
    }
    while(arr2.length < len) {
        arr2.push(0);
    }
    
    for(let i = 0; i < arr1.length; i++) {
        const item1 = +arr1[i];
        const item2 = +arr2[i];
        if(item1 < item2) {
            return -1;
        }
        else if(item1 > item2) {
            return 1;
        }
    }
    return 0;
}

优化版本位数不相同时比较逻辑

其实这个方法和方法一差不多,只是简化了对齐版本号的操作

function compareVersion(v1, v2) {
    const arr1 = v1.split('.');
    const arr2 = v2.split('.');
    const len = Math.max(arr1.length, arr.length);
    for(let i = 0; i < len; i++) {
        const item1 = arr1[i] ? +arr1[i] : 0;
        const item2 = arr2[i] ? +arr2[i] : 0;
        if(item1 < item2) {
            return -1;
        }
        else if(item1 > item2) {
            return 1;
        }
    }
    return 0;
}

优化字符串或缺失转换为数字的逻辑

function compareVersion(v1, v2) {
    const arr1 = v1.split('.');
    const arr2 = v2.split('.');
    const len = Math.max(arr1.length, arr.length);
    for(let i = 0; i < len; i++) {
        if(~~arr1[i] < ~~arr2[i]) {
            return -1;
        }
        else if(~~arr1[i] > ~~arr2[i]) {
            return 1;
        }
    }
    return 0;
}

计算每位版本的和,然后比较大小

思路:计算每个'.'之间的数字的和

function compareVersion(v1, v2) {
    const len1 = v1.length;
    const len2 = v2.length;
    let x1 = 0, x2 = 0;
    while(x1 < len1 || x2 < len2) {
        let sum1 = 0, sum2 = 0;
        while(x1 < len1 && v1[x1] !== '.') {
            sum1 += sum1 * 10 + v1.[x1];
            x1++;
        }
        // 下次开始计算的位置,需要跳过'.'
        x1++;
        
        while(x2 < len2 && v2[x2] !== '.') {
            sum2 += sum2 * 10 + v2[x2];
            x2++;
        }
        // 下次开始计算的位置,需要跳过'.'
        x2++;
        
        if(sum1 > sum2) {
            return 1;
        }
        else if(sum1 < sum2){
            return -1
        }
    }
    return 0;
}