这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
一、了解题目
附上原题链接:165. 比较版本号
给你两个版本号 version1 和 version2 ,请你比较它们。
版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。
比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 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
以上就是关于比较版本号的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋