286,比较版本号

比较两个版本号 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”。

提示:

  1. 版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。

  2. 版本字符串不以点开始或结束,并且其中不会有两个连续的点。

答案:

 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}

这种我们自己拆分在面试中会更占有优势,原理也很简单,就不再介绍。

上一篇:IDEA 如何删除 changeList 删除


下一篇:286 约束布局之4—自动添加约束