Question
Compare two version numbers version1 and version2.
If ​​​version1 > version2​​​ return ​​1​​​, if ​​version1 < version2​​​ return ​​-1​​​, otherwise return ​​0​​.

You may assume that the version strings are non-empty and contain only digits and the ​​.​​​ character.
The ​​​.​​​ character does not represent a decimal point and is used to separate number sequences.
For instance, ​​​2.5​​ is not “two and a half” or “half way to version three”, it is the fifth second-level revision of the second first-level revision.

Here is an example of version numbers ordering:

0.1 < 1.1 < 1.2 < 13.37


本题难度Easy。

split

【前提】
You may assume that the version strings are non-empty and contain only digits and the . character.

【复杂度】
时间 O(N) 空间 O(N)

【思路】
利用split函数对版本号按照​​​"."​​进行分割,然后依次比较。

这题的难点在于几个corner case:

  1. ​1.0​​​和​​1​​是一个版本,意味即使长度不一样,也要检查后面是否都是0
  2. ​1.15​​​要大于​​1.5​​,因为前者是第15个子版本,而后者是第5个


【注意】
因为split方法输入的是一个正则表达式所以不能直接用​​​.​​​,而是要用​​\.​​​,而java的​​\​​​要转义,所以要用​​\\.​

【代码】

public class Solution {
public int compareVersion(String version1, String version2) {
//require
String[] nums1=version1.split("\\."),nums2=version2.split("\\.");
//invariant
for(int i=0;i<Math.min(nums1.length,nums2.length);i++){
int a=Integer.parseInt(nums1[i]),b=Integer.parseInt(nums2[i]);
if(a>b)return 1;
else if(a<b)return -1;
}
//在剩余的数字里面看有没有非0
if(nums1.length>nums2.length){
for(int i=nums2.length;i<nums1.length;i++)
if(Integer.parseInt(nums1[i])!=0)return 1;
}else if(nums1.length<nums2.length){
for(int i=nums1.length;i<nums2.length;i++)
if(Integer.parseInt(nums2[i])!=0)return -1;
}
//ensure
return 0;
}
}