重温算法之比较版本号

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一.题目介绍

1.题目来源

链接:LeetCode

2.题目

给你两个版本号 version1 和 version2 ,请你比较它们。

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

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

image.png

二.具体实现

1.实现思路

这个题目的考察点是考察我们对双指针的运用熟练度,其实在实际的开发过程中,双指针也运用得很多,那么接下来我们看看这道题怎么去做,我们可以先按点号(.)分割,然后进行大小的比较,version1中元素大于version2中的则代表version1与version2下标为0的修订号是相同的,反正之则不同吗,依次比较,则可得出结果。

2.实现代码

1)自己的实现方式

public int compareVersion(String version1, String version2) {
    //先按.分割
    String[] s1 = version1.split("\.");
    String[] s2 = version2.split("\.");
   //取出两者中最长的
    int len = Math.max(s1.length,s2.length);
    int i1 = 0;
    int i2 = 0;
   //按最长遍历,依次比较元素
    for(int i=0;i<len;i++){
        if(s1.length>i && s2.length>i && Integer.valueOf(s1[i])>Integer.valueOf(s2[i])){
            return 1;
        }else if(s1.length>i && s2.length>i && Integer.valueOf(s1[i])<Integer.valueOf(s2[i])){
            return -1;
        }
        if(s1.length>i)
            i1=i1+Integer.valueOf(s1[i]);
        if(s2.length>i)
            i2=i2+Integer.valueOf(s2[i]);
    }
    if(i1>i2)return 1;
    if(i1<i2)return -1;
    return 0;
}
复制代码

2)题友的实现方式

(双指针)  O(n + m)O(n+m) 具体过程如下:

1、定义两个指针 i和j,初始化i = 0,j = 0。

2、两个指针分别遍历两个字符串,将每个小数点'.'分隔开的修订号解析成数字,并进行大小比较:

如果 num1 > num2,返回 1;

如果 num1 < num2,返回 -1;

3、i++,j++,两个指针都后移一步,进行下一轮的修订号解析比较。

4、如果遍历完两个字符串都没有返回相应结果,说明两个字符串相等,返回0。

代码: image.png

3.运行结果

image.png

image.png

三.题后思考

当看到这个题目时我第一个想法是循环遍历,但是思路不对,然后去看了题友的解题思路才想有点想法。有时候没有思路也可以参考题友的做法,我们的最终目的是学习而不是跟自己硬磕,理解思路,学会其思路也是一种收获。

猜你喜欢

转载自juejin.im/post/7076093998598717453