问题描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1 和 version2,判断哪个版本更新,或者它们是否相同。
例如,2.5.33 和 0.1 都是有效的版本号。
当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为0。
你需要根据以下规则返回比较结果:
- 如果
version1 > version2,返回1。 - 如果
version1 < version2,返回-1。 - 如果两个版本相等,返回
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.0" , version2 = "1.0.0"
输出:0
-
处理版本号数组的长度差异:
- 在循环中,确保你处理了两个版本号数组的长度差异。如果一个版本号数组比另一个短,缺失的部分应该视为
0。
- 在循环中,确保你处理了两个版本号数组的长度差异。如果一个版本号数组比另一个短,缺失的部分应该视为
-
比较修订号:
- 在每次循环中,比较当前修订号的整数值。如果发现不相等的修订号,直接返回比较结果。
-
循环结束后返回结果:
- 如果循环结束后没有发现不相等的修订号,说明两个版本号相等,返回
0。
- 如果循环结束后没有发现不相等的修订号,说明两个版本号相等,返回
代码
public class Main { public static void main(String[] args) { System.out.println(solution("0.1", "1.1") == -1); System.out.println(solution("1.0.1", "1") == 1); System.out.println(solution("7.5.2.4", "7.5.3") == -1); System.out.println(solution("1.0", "1.0.0") == 0); }
public static int solution(String version1, String version2) {
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
int maxLength = Math.max(v1.length, v2.length);
for (int i = 0; i < maxLength; i++) {
int x = (i < v1.length) ? Integer.parseInt(v1[i]) : 0;
int y = (i < v2.length) ? Integer.parseInt(v2[i]) : 0;
if (x > y) {
return 1;
}
if (x < y) {
return -1;
}
}
return 0;
}
}
解释:
maxLength:计算两个版本号数组的最大长度,确保循环能够覆盖所有修订号。x和y:分别表示当前修订号的整数值。如果某个版本号数组长度不足,缺失的部分视为0。- 循环中的比较:在每次循环中,比较当前修订号的整数值。如果发现不相等的修订号,直接返回比较结果。
- 循环结束后返回结果:如果循环结束后没有发现不相等的修订号,说明两个版本号相等,返回 `0
Integer.parseInt(v1[i]):将修订号字符串转换为整数,自动忽略前导零。Integer.parseInt(v2[i]):同理,将修订号字符串转换为整数,自动忽略前导零。