比较两个版本号 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。
你可以假设版本字符串非空,并且只包含数字和 . 字符。
. 字符不代表小数点,而是用于分隔数字序列。
例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。
你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 3 和 4。其第三级和第四级修订号均为 0。
示例 1:
输入:version1 = "0.1", version2 = "1.1"
输出: -1
示例 2:
输入: version1 = "1.0.1", version2 = "1"
输出: 1
示例 3:
输入:version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
示例 4:
输入:version1 = "1.01", version2 = "1.001" 输出:0 解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
示例 5:
输入:version1 = "1.0", version2 = "1.0.0" 输出:0 解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。
提示:
-
版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
-
版本字符串不以点开始或结束,并且其中不会有两个连续的点。
答案:
1public 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}
解析:
上面代码非常简单,直接调用api把version拆分成数组,然后再比较即可,但如果面试的话,这肯定不是面试官想要的,如果不调用api我们该怎么比较,看下代码
1public int compareVersion(String version1, String version2) {
2 int temp1 = 0, temp2 = 0;
3 int len1 = version1.length(), len2 = version2.length();
4 int i = 0, j = 0;
5 while (i < len1 || j < len2) {
6 temp1 = 0;
7 temp2 = 0;
8 while (i < len1 && version1.charAt(i) != '.') {
9 temp1 = temp1 * 10 + version1.charAt(i++) - '0';
10 }
11 while (j < len2 && version2.charAt(j) != '.') {
12 temp2 = temp2 * 10 + version2.charAt(j++) - '0';
13 }
14 if (temp1 > temp2)
15 return 1;
16 else if (temp1 < temp2)
17 return -1;
18 else {
19 i++;
20 j++;
21 }
22 }
23 return 0;
24}
这种我们自己拆分在面试中会更占有优势,原理也很简单,就不再介绍。