题目解析:版本号比较
题目描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1 和 version2,判断哪个版本更新,或者它们是否相同。
思路
-
分割版本号:
- 使用
split方法将版本号按照.分割成修订号数组。
- 使用
-
比较修订号:
- 遍历两个版本号的修订号数组,逐个比较修订号。
- 如果某个版本号的修订号数组较短,则认为该位置的修订号为
0。
-
忽略前导零:
- 使用
Integer.parseInt将修订号字符串转换为整数,这样可以自动忽略前导零。
- 使用
-
返回结果:
- 如果某个修订号不相等,则根据大小关系返回
1或-1。 - 如果所有修订号都相等,则返回
0。
- 如果某个修订号不相等,则根据大小关系返回
图解
假设有两个版本号 version1 = "1.0.1" 和 version2 = "1.0":
-
分割版本号:
version1分割后为["1", "0", "1"]version2分割后为["1", "0"]
-
比较修订号:
- 第1个修订号:
1vs1,相等。 - 第2个修订号:
0vs0,相等。 - 第3个修订号:
1vs0,1 > 0,返回1。
- 第1个修订号:
代码详解
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[] v1Parts = version1.split("\\.");
String[] v2Parts = version2.split("\\.");
// 获取修订号数组的长度
int len1 = v1Parts.length;
int len2 = v2Parts.length;
// 遍历修订号
for (int i = 0; i < Math.max(len1, len2); i++) {
// 获取当前修订号,如果超出数组长度则视为0
int v1 = (i < len1) ? Integer.parseInt(v1Parts[i]) : 0;
int v2 = (i < len2) ? Integer.parseInt(v2Parts[i]) : 0;
// 比较修订号
if (v1 > v2) {
return 1;
} else if (v1 < v2) {
return -1;
}
}
// 如果所有修订号都相等
return 0;
}
}
知识总结
在刷题过程中,我学到了以下几个知识点:
- 字符串分割:使用
split方法将字符串按照指定分隔符分割成数组。 - 数组遍历:使用
for循环遍历数组,并处理数组长度不一致的情况。 - 字符串转换为整数:使用
Integer.parseInt方法将字符串转换为整数,自动忽略前导零。
学习建议
- 理解题目要求:在开始编写代码之前,确保完全理解题目的要求和输入输出格式。
- 逐步实现:先实现基本功能,再逐步优化和处理边界情况。
- 测试用例:编写多个测试用例,确保代码在各种情况下都能正确运行。
学习计划
-
制定刷题计划:
- 每天刷一定数量的题目,逐步增加难度。
- 按照数据结构和算法分类刷题,系统性地掌握知识点。
-
利用错题进行针对性学习:
- 记录错题,分析错误原因,并进行针对性练习。
- 定期回顾错题,确保不再犯同样的错误。
工具运用
-
结合AI刷题功能:
- 使用豆包MarsCode AI刷题功能,获取题目解析和代码提示。
- 结合其他在线编程平台(如LeetCode、牛客网)进行练习。
-
多资源结合:
- 结合书籍、视频教程等资源,系统学习数据结构和算法。
- 参与编程社区和讨论,与其他学习者交流经验。