「双指针」leetcode 165.比较版本号(中等)

404 阅读1分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

一、了解题目

附上原题链接:165. 比较版本号

给你两个版本号 version1version2 ,请你比较它们。

版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.330.1 都是有效的版本号。

比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 010 < 1

返回规则如下:

  • 如果 version1 > version2 返回 1
  • 如果 version1 < version2 返回 -1
  • 除此之外返回 0

示例:

输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,"01""001" 都表示相同的整数 "1"

二、题解分析

依据以上题意,我们来看下这道题的解题思路。具体如下:

  • 处理字符串,去掉点 . ,转换成数组;
  • 将数组中的每一个元素前面的 0 一一去掉;
  • 获取两个数组中的最大长度;
  • 对两个数组进行比较,小的数组依次补 0 ,直到长度跟最大长度相等;
  • 再比较两个数组的每一项, v1 大的返回1, v1 小的返回 -1 ,相等时则返回 0

三、字典解法

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * @param {string} version1
 * @param {string} version2
 * @return {number}
 */
 let compareInt = function(arr1,arr2){
    //  1.先看下两个数组哪个长度更大
    let len = Math.max(arr1.length,arr2.length);
    // 2.如果数组arr1的长度比arr2小,那么后面补0,直到长度相等为止
    while(arr1.length < len) {
        arr1.push(0);
    }
    // 3.如果数组arr2的长度比arr1小,那么后面补0,直到长度相等为止
    while(arr2.length < len){
        arr2.push(0);
    }
    // 4.数组长度一致了,来开始比较两个版本(平行对比)
    for(let i = 0; i < len; i++){
        // 3.1 当版本号1大于版本号2时,返回1
        if(arr1[i] > arr2[i]) {
            return 1;
        }
        // 3.2 当版本号1大于版本号2时,返回2
        else if(arr1[i] < arr2[i]){
            return -1;
        }
    }
    // 5.其余情况返回0
    return 0;
}
let compareVersion = function(version1, version2) {
    // 1.处理version1字符串,去掉点,处理成数组
    let v1 = version1.split('.');
    // 2.处理version2字符串,去掉点,处理成数组
    let v2 = version2.split('.');
    // 3.map方法用于返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
    v1 = v1.map((item)=>Number(item));
    v2 = v2.map((item)=>Number(item));
    // 将版本号1和版本号2进行比较
    return compareInt(v1,v2);
};
​
console.log(compareVersion("1.01","1.001")); // 0

以上就是关于比较版本号的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋