一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情。
前言
力扣第165题 比较版本号 如下所示:
一、思路
这一题比较贴近实际,就是比较两个版本号的大小(版本号以 . 隔开,例如 1.2.3)。在从左到右比较的过程中,我们需要注意以下两点:
- 忽略前导
0,例如1.001和1.1是相等的 - 如果版本号中没有某下标处的修订号,则视为
0
修订号的个数:指版本号通过
.分割得到的数组长度
我们先以最普通的例子作为比较 version1 = 7.5.3.4, version2 = 7.5.3,我们大致的处理步骤如下所示:
- 比较相同个数的修订号,以短一点的修订号个数为准。此处这里选取
version2的的修订号个数3作为基准 - 如步骤一比较中,修订号都相同。则比较版本号的修订号个数,修订号个数多的更大
为了解决 version1 = 1.0, version2 = 1.0.0 因修订号个数不同而导致返回了错误的结果。我们在比较前删除版本号中后面所有连续的 0,例如 1.00.0.000.0 经过删除后置零后变为 1
举个例子
此处以示例中的 version1 = 7.5.3.4, version2 = 7.5.3 作为例子
- 分割出修订号,
arr1 = {7, 5, 3, 4},arr2 = {7, 5, 3} - 选取出较短的修订号个数
minLen = 3 - 在
arr1和arr2中取前3位进行比较,发现均相等 - 最后比较
arr1和arr2的修订号个数,发现arr1.len > arr2.len,故返回1
综上所述,处理的步骤如下所示:
- 去除版本号中后置零
- 比较前
m个修订号,如有不相等则立即返回(m为较短的修订号个数) - 最后比较两者修订号个数
二、实现
实现代码
实现代码与思路中一致
public int compareVersion(String version1, String version2) {
version1 = rmBehindZero(version1);
version2 = rmBehindZero(version2);
// 忽略后导 0
String[] arr1 = version1.split("\.");
String[] arr2 = version2.split("\.");
int minLen = Math.min(arr1.length, arr2.length);
// 开始比较
for (int i=0; i<minLen; i++){
int val1 = Integer.parseInt(arr1[i]);
int val2 = Integer.parseInt(arr2[i]);
if (val1 > val2)
return 1;
else if (val1 < val2)
return -1;
}
// 最后比较长度
return Integer.compare(arr1.length, arr2.length);
}
// 去除所有后置的连续0
public String rmBehindZero(String str){
int end = str.length();
while (end > 2){
int sign = end; // 做个标记
while (str.charAt(sign-1) == '0'){
sign--;
}
if (str.charAt(sign-1) == '.'){
sign--;
end = sign;
}else {
break;
}
}
return str.substring(0, end);
}
测试代码
public static void main(String[] args) {
new Number165().compareVersion("1", "1.00.0.000.0");
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~