原题地址:版本号比较 - MarsCode
问题描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 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
步骤一:分割版本号
String[] v1Parts = version1.split("\.");
String[] v2Parts = version2.split("\.");
这里使用 split 方法,以点号(.)作为分隔符,将输入的版本号字符串拆分成字符串数组。例如,对于版本号 "1.2.3",经过分割后会得到一个包含三个元素("1"、"2"、"3")的字符串数组。这样做的目的是方便后续按各个修订号部分依次进行比较。需要注意的是,在 split 方法中使用 \. 是因为 . 在正则表达式中有特殊含义(表示匹配任意字符),所以要进行转义才能正确地按点号来分割字符串。
步骤二:比较修订号
int maxLength = Math.max(v1Parts.length, v2Parts.length);
for (int i = 0; i < maxLength; i++) {
int v1Num = (i < v1Parts.length)? Integer.parseInt(v1Parts[i]) : 0;
int v2Num = (i < v2Parts.length)? Integer.parseInt(v2Parts[i]) : 0;
if (v1Num > v2Num) {
return 1;
} else if (v1Num < v2Num) {
return -1;
}
}
-
首先,通过
Math.max方法获取两个版本号分割后数组长度的最大值,确定循环比较的次数。这样可以确保即使两个版本号的修订号数量不一致(比如一个是1.2,另一个是1.2.3),也能完整地比较所有存在的修订号部分。 -
在循环内部,对于每个对应的修订号位置:
- 通过三元表达式来获取当前位置的修订号整数值。如果当前索引
i小于对应版本号数组的长度,就使用Integer.parseInt方法将字符串形式的修订号转换为整数;如果索引超出了数组长度(意味着该版本号在这个位置之后没有更多的修订号了),则视为0。例如,对于版本号"1.2"和"1.2.3"比较时,在第三次循环(i = 2)时,较短的版本号("1.2")对应的修订号数值就会被视为0。 - 接着比较当前位置的两个修订号整数值
v1Num和v2Num。如果v1Num大于v2Num,说明version1的这个版本号部分更大,按照规则直接返回1;如果v1Num小于v2Num,则返回-1。如果两者相等,就继续循环比较下一个修订号位置,直到所有对应的修订号都比较完或者已经得出大小关系并返回相应结果。
- 通过三元表达式来获取当前位置的修订号整数值。如果当前索引
完整代码:
public static int solution(String version1, String version2) {
// 1. 分割版本号
String[] v1Parts = version1.split("\\.");
String[] v2Parts = version2.split("\\.");
// 2. 比较修订号
int maxLength = Math.max(v1Parts.length, v2Parts.length);
for (int i = 0; i < maxLength; i++) {
// 获取当前修订号的整数值,缺失的部分视为0
int v1Num = (i < v1Parts.length) ? Integer.parseInt(v1Parts[i]) : 0;
int v2Num = (i < v2Parts.length) ? Integer.parseInt(v2Parts[i]) : 0;
// 比较当前修订号
if (v1Num > v2Num) {
return 1;
} else if (v1Num < v2Num) {
return -1;
}
// 如果相等,继续比较下一个修订号
}
// 3. 所有修订号都相等
return 0;
}