给大家分享一下我最近刷的几道题的解析,还有我对 AI 助手的使用心得,这是第一次给大家分享的刷题解析和经验分享,这个系列预计有六期,今天给大家带来第五期的分享。
今天的第一题 —— 比较两个版本号的大小
问题描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号 “.” 分隔。每个修订号可能有多位数字,并且可能会包含前导零。需要根据两个版本号 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
解决方案
要解决这个问题,可以按照以下步骤进行:
-
拆分版本号:
- 首先,将输入的两个版本号 version1 和 version2 按照 “.” 进行分割,这样就可以得到各自修订号组成的数组。例如,版本号 “1.2.3” 会被分割成字符串数组 ["1", "2", "3"]。
-
获取修订号数组长度:
- 分别获取两个版本号拆分后得到的修订号数组的长度,记为 len1 和 len2。这两个长度将用于后续的循环比较操作,确保能够完整地比较每个修订号。
-
逐个比较修订号:
- 通过一个循环,从左到右依次比较两个版本号的修订号。循环的次数取两个修订号数组长度中的最大值,即 Math.max (len1, len2)。这样可以保证即使两个版本号的修订号数量不同,也能完整地进行比较。
-
获取当前修订号的整数值:
- 在每次循环中,需要获取当前要比较的修订号的整数值。如果当前索引 i 小于对应的修订号数组长度,就使用 Integer.parseInt () 方法将字符串形式的修订号转换为整数;如果索引 i 已经超出了数组长度,说明该版本号在这个位置没有修订号了,按照规则默认将其视为 0。
-
比较当前修订号:
- 得到两个版本号当前位置的修订号整数值 v1 和 v2 后,就可以进行比较了。
- 如果 v1 大于 v2,说明 version1 在这个位置的修订号更大,那么整体上 version1 就更大,此时返回 1。
- 如果 v1 小于 v2,说明 version2 在这个位置的修订号更大,那么整体上 version2 就更大,此时返回 -1。
- 如果 v1 和 v2 相等,说明在这个位置两个版本号的修订号相同,那么就继续比较下一个修订号。
-
判断最终结果:
-
如果经过完整的循环比较后,所有的修订号都相等,那么就说明两个版本号是相等的,此时返回 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[] 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;
}
// 如果相等,继续比较下一个修订号
}
//如果所有修订号都相等,返回 0
return 0;
}
}
代码功能概述
这段代码主要实现了比较两个版本号大小的功能。通过将版本号拆分成修订号数组,然后逐个比较修订号对应的整数值,按照给定的规则返回两个版本号的比较结果,即判断出哪个版本更新或者它们是否相等。
代码细节
类定义与函数布局:
-
Main是一个包含solution方法的公开类。solution方法接收两个字符串参数 version1 和 version2,分别代表要比较的两个版本号,并返回一个整数结果,表示两个版本号的比较情况(1 表示 version1 大于 version2,-1 表示 version1 小于 version2,0 表示两者相等)。
字符处理逻辑:
-
在拆分版本号时,使用
split("\.")方法按照 “.” 对版本号进行分割,得到修订号数组。在获取当前修订号整数值时,通过条件判断结合Integer.parseInt()方法,根据索引是否超出数组长度来正确获取整数值,要么将字符串修订号转换为整数,要么将缺失的修订号视为 0。
结果拼接与返回:
-
整个比较过程是在循环中进行的,每次比较当前修订号后,根据比较结果可能直接返回 1 或 -1。如果循环结束后所有修订号都相等,就返回 0 作为最终的比较结果。
核心逻辑
这段代码的核心在于通过循环逐个比较两个版本号的修订号。先将版本号合理拆分,再准确获取每个修订号的整数值进行比较,根据比较结果及时返回相应的值,以确定两个版本号的大小关系。由于需要遍历最多到两个修订号数组中较长的那个长度,所以算法的时间复杂度为,其中是 version1 的修订号数量,是 version2 的修订号数量。
总结
这段代码利用简单的字符串处理和整数比较操作,清晰、有效地实现了比较两个版本号大小的功能。通过对版本号的合理拆分和逐个修订号的比较,使得代码逻辑易于理解且能准确地得到比较结果。这不仅加深了我们对字符串处理和版本号比较逻辑的理解,也让我们看到了如何在处理类似的版本管理相关问题中应用这些基本的编程技巧。
我对 AI 助手的使用心得
在进行这道题的编程与算法学习的过程中,豆包 AI 助手依旧是我重要的解题工具。当我在理解如何准确拆分版本号、获取修订号整数值以及按照规则进行比较等关键步骤时,AI 助手给我提供了清晰的解释和更多的参考思路。它帮助我更好地把握问题的关键所在,比如如何处理前导零以及在不同修订号数量情况下的比较逻辑。AI 助手就像是一个随时在身边的导师,为我的学习和编程旅程提供了极大的便利与帮助,让我能更深入地探索编程知识和算法应用。希望我的这些体会能帮助到同样在编程之路上前行的朋友们!