一.题目介绍
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 。
二.具体实现
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。
代码:
3.运行结果
三.题后思考
当看到这个题目时我第一个想法是循环遍历,但是思路不对,然后去看了题友的解题思路才想有点想法。有时候没有思路也可以参考题友的做法,我们的最终目的是学习而不是跟自己硬磕,理解思路,学会其思路也是一种收获。