【版本号比较工具-(算法版)】

1.版本号工具

之前在网上看到版本号工具,觉得还行,就一直用这个。代码如下,写的也挺简洁的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static int compareAppVersion(String version1, String version2) {
if (version1 == null || version2 == null) {
throw new RuntimeException("版本号不能为空");
}
// 注意此处为正则匹配,不能用.
String[] versionArray1 = version1.split("\\.");
String[] versionArray2 = version2.split("\\.");
int idx = 0;
// 取数组最小长度值
int minLength = Math.min(versionArray1.length, versionArray2.length);
int diff = 0;
// 先比较长度,再比较字符
while (idx < minLength
&& (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0
&& (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {
++idx;
}
// 如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大
diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
return diff;
}

2.算法版本

不过最近发现,leetcode大神们写的算法,比较版本号。真的是简洁优雅高效,而且逻辑上更加完善。这边版本号是(忽略任何前导零后的整数值 例如1.01和1.001是一样的)。而且没有对string进行转换成数组,整体运行时间和空间都更佳。真正的简洁、优雅高效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int compareVersion(String version1, String version2) {
if (version1 == null || version2 == null) {
throw new RuntimeException("版本号不能为空");
}
int i = 0, j = 0;
int n = version1.length(), m = version2.length();
while (i < n || j < m) {
int a = 0;
for (; i < n && version1.charAt(i) != '.'; i++) {
a = a * 10 + version1.charAt(i) - '0';
}
i++;
int b = 0;
for (; j < m && version2.charAt(j) != '.'; j++) {
b = b * 10 + version2.charAt(j) - '0';
}
j++;
if (a != b) {
return a > b ? 1 : -1;
}
}
return 0;
}

3.结论

看了大神们写的代码,发现和人的差距太大了。
算法真的太神奇了。

作者

纪东东

发布于

2023-11-14

更新于

2023-11-16

许可协议