Compare two version numbers version1 and version1. 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
这道题的意思用一个例子说明就是1.2 < 1.10, 由于1.10跟1.1是不同的,1.10表明tenth revision. 而1.1表明first revision。因此这道题要按“.”分段,而后分段比较,方法是用split函数把string 分段,每一段挨个比过去。这里参考了网上的一个小技巧:git
因为两串字符串并非同样长度的,若是分状况比较,如第一个长,遍历逐一比较则要分状况讨论。此时就采起一些小技巧,将两个字符串对齐,就无需考虑各类状况,超出的位数补0便可,这是一种字符串、数串比较的小技巧。好比比较 1 和 1.0正则表达式
因此这里取了两个string长度的最大值 maxLen, 来创建两个数组来存split“.”以后分出来的数字,短的那个数组末尾默认补0. 而后从左到右挨个比过去express
Integer.parseInt()函数能将“012”转化为12,解决了首位为0的问题数组
另外用split函数有一点特别要注意:咱们知道,“ . ”在正则表达式中有特殊的含义,所以咱们使用的时候必须进行转义。less
不转义就会有以下结果:ide
String ipstring="59.64.159.224"; 函数
String iparray[]=ipstring.split("."); spa
for(String stemp:iparray){ code
System.out.println(stemp); three
}
这个输出为空,为何呢?
public string[] split(string regex) 这里的参数的名称是regex ,也就是 regular expression (正则表达式)。
“ . ”在正则表达式中有特殊的含义,表示means "any character" in regex
因此若是就想表示一个点的话,use either split("\\.")
or split(Pattern.quote("."))
.
1 public class Solution { 2 public int compareVersion(String version1, String version2) { 3 String[] strs1 = version1.split("\\."); 4 String[] strs2 = version2.split("\\."); 5 int maxLen = Math.max(strs1.length, strs2.length); 6 int[] nums1 = new int[maxLen]; 7 int[] nums2 = new int[maxLen]; 8 for (int i=0; i<strs1.length; i++) { 9 nums1[i] = Integer.parseInt(strs1[i]); 10 } 11 for (int i=0; i<strs2.length; i++) { 12 nums2[i] = Integer.parseInt(strs2[i]); 13 } 14 for (int i=0; i<maxLen; i++) { 15 if (nums1[i] > nums2[i]) return 1; 16 else if (nums1[i] < nums2[i]) return -1; 17 } 18 return 0; 19 } 20 }
Improve a lit bit by using less memory
1 public int compareVersion(String version1, String version2) { 2 String[] levels1 = version1.split("\\."); 3 String[] levels2 = version2.split("\\."); 4 5 int length = Math.max(levels1.length, levels2.length); 6 for (int i=0; i<length; i++) { 7 Integer v1 = i < levels1.length ? Integer.parseInt(levels1[i]) : 0; 8 Integer v2 = i < levels2.length ? Integer.parseInt(levels2[i]) : 0; 9 int compare = v1.compareTo(v2); 10 if (compare != 0) { 11 return compare; 12 } 13 } 14 15 return 0; 16 }