戳蓝字"
前端优选
"
关注我们哦
!
比较两个版本号v1和v2:
如果v1 > v2 则返回1;
如果v1 < v2 则返回-1;
其他情况返回0。
现假定版本字符串非空,且只包含数字和字符.
.
字符不代表小数点,只用于分隔数字序列
例如:1.5不是一个半,也不是差一点到二,而是第一个版本中第五个小版本
分割遍历
1function compareVersion(v1,v2){
2 let num1 = v1.split('.');
3 let num2 = v2.split('.');
4 let temp = 0;
5 let length = Math.max(num1.length,num2.length);
6 for(let i=0;i<length;i++){
7 let data1 = 0,data2 = 0;
8 if(i<num1.length){
9 data1 = parseInt(num1[i]);
10 }
11 if(i<num2.length){
12 data2 = parseInt(num2[i]);
13 }
14 console.log(data1,data2);
15 if(data1 < data2){
16 return -1;
17 }else if(data1 > data2){
18 return 1;
19 }
20 }
21 return 0;
22}
将两个版本号以点分割为数组,然后以较长的数组长度循环,对于版本号位数不一致的位数进行补零操作(data1=0,data2=0),然后每位逐一比对,在比较出结果时跳出循环,比对即结束。例如:
1compareVersion('3.2.1','2.2.3')
2//3,2
3//1
4compareVersion('1.2.1','1.2.3')
5//1,1
6//2,2
7//1,3
8//-1
9compareVersion('2.1.3.1','2.1.3')
10//2,2
11//1,1
12//3,3
13//1,0
14//1
时间复杂度:O(N+M+max(N,M))。其中 NN 和 MM 指的是输入字符串的长度。
空间复杂度O(N+M),使用了两个数组 nums1 和 nums2 存储两个字符串的块。
双指针
双指针不需要判断哪个版本号比较长;当一个版本号长度不足时进行补零
1function compareVersion(v1,v2){
2 let num1 = v1.split('.');
3 let num2 = v2.split('.');
4 let index = 0;
5 while(index < num1.length || index < num2.length){
6 if(!num1[index]){
7 num1[index] = 0;
8 }
9 if(!num2[index]){
10 num2[index] = 0;
11 }
12 console.log(+num1[index] , +num2[index])
13 if(+num1[index] < +num2[index]){
14 return -1;
15 }else if(+num1[index] > +num2[index]){
16 return 1;
17 }else {
18 index ++;
19 }
20 }
21 return 0;
22}
以较长的数组长度遍历,当长度不足时(!num1[index],!num2[index]),对其进行补零操作;通过运算符+
将值从字符串类型转为数字类型,以便进行值的比较;当比较出结果时即跳出循环。
1compareVersion('1.2.1','2.2.1')
2// 1,2
3// -1
4compareVersion('1.2.3','1.2.1')
5// 1,1
6// 2,2
7// 3,1
8// 1
9compareVersion('1.2.3.1','1.2.3')
10// 1,1
11// 2,2
12// 3,3
13// 1,0
14// 1
时间复杂度:O(max(N,M))。其中 NN 和 MM 指的是输入字符串的长度。
空间复杂度:O(1),没有使用额外的数据结构。双指针算法是经常遇到的一个解题思路,即同时前后移动两个指针对值进行比较,这点需要我们掌握。
点击“阅读原文”查看上期算法实例
点个在看,大家都看