大厂面试算法之比较版本号

戳蓝字"

前端优选

"

关注我们哦

比较两个版本号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),没有使用额外的数据结构。

双指针算法是经常遇到的一个解题思路,即同时前后移动两个指针对值进行比较,这点需要我们掌握。

点击“阅读原文”查看上期算法实例

点个在看,大家都看 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值