题目描述:比较两个版本号的大小,返回 -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;
}