华为OD机试 2025B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。
一、题目描述
在 软件版本管理 中,版本号由点分隔的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号。若 version1 >= version2 返回 0。
二、输入描述
输入两个字符串 version1 和 version2,遵循以下规则:
- 版本号由数字和点组成,且至少包含一个数字。
- 点不会作为数字的开始或结束,也不会连续出现。
- 每个数字部分的数字值可能不等(例如 1.01 和 1.001视为相同)。
- 两个字符串中间以英文逗号分隔。
三、输出描述
输出一个整数,表示可用版本号的个数。具体规则如下:
如果 version1 >= version2,返回0。
否则,找到第一个不同的版本号,假设在位置 i,version1 的该段值为 v1,version2 的该段值为 v2。可用版本号的个数为 v2-v1-1。
如果第一个不同段之后的版本段在version2中不全为0,则返回0。
四、测试用例
测试用例1:
1、输入
1.2,1.4
2、输出
1
3、说明
不同段中 version1 为2,version2 为4,4-2-1=1
测试用例2:
1、输入
1.4,1.2
2、输出
0
3、说明
version1 > version2的情况,根据规则直接返回0。
五、解题思路
- 将字符串版本号按点号分割,转换为整数数组
- 逐段比较版本号大小,处理不等长的情况
- 找到第一个不同段后,检查后续段是否都为0,然后计算差值
- 正确处理version1 >= version2的情况
六、Java算法源码
public class OdTest {
public static void main(String[] args) {
// 创建Scanner对象用于控制台输入
Scanner scanner = new Scanner(System.in);
// 读取输入的版本号字符串(用逗号分隔)
String input = scanner.nextLine();
// 按逗号分割得到两个版本号
String[] versions = input.split(",");
String version1 = versions[0];
String version2 = versions[1];
// 调用计算方法并输出结果
System.out.println(countAvailableVersions(version1, version2));
scanner.close();
}
/**
* 计算两个版本号之间的可用版本数量
* @param version1 第一个版本号
* @param version2 第二个版本号
* @return 可用版本数量
*/
public static int countAvailableVersions(String version1, String version2) {
// 使用点号分割版本号字符串
String[] v1Parts = version1.split("\\.");
String[] v2Parts = version2.split("\\.");
// 将字符串数组转换为整数数组,处理前导零的情况
int[] v1 = new int[v1Parts.length];
int[] v2 = new int[v2Parts.length];
// 转换version1的各个段为整数
for (int i = 0; i < v1Parts.length; i++) {
v1[i] = Integer.parseInt(v1Parts[i]);
}
// 转换version2的各个段为整数
for (int i = 0; i < v2Parts.length; i++) {
v2[i] = Integer.parseInt(v2Parts[i]);
}
// 比较两个版本号的大小,如果version1 >= version2,返回0
if (compareVersions(v1, v2) >= 0) {
return 0;
}
// 找到第一个不同的版本段
int maxLen = Math.max(v1.length, v2.length);
for (int i = 0; i < maxLen; i++) {
// 获取当前段的值,如果超出数组长度则视为0
int val1 = i < v1.length ? v1[i] : 0;
int val2 = i < v2.length ? v2[i] : 0;
// 如果找到第一个不同的段
if (val1 != val2) {
// 检查第一个不同段之后的version2的所有段是否都为0
for (int j = i + 1; j < v2.length; j++) {
if (v2[j] != 0) {
// 如果有非零段,返回0
return 0;
}
}
// 计算可用版本数:v2 - v1 - 1
return val2 - val1 - 1;
}
}
// 如果所有段都相同,返回0
return 0;
}
/**
* 比较两个版本号的大小
* @param v1 版本号1的整数数组
* @param v2 版本号2的整数数组
* @return -1表示v1<v2, 0表示v1=v2, 1表示v1>v2
*/
public static int compareVersions(int[] v1, int[] v2) {
// 取两个版本号长度的最大值进行比较
int maxLen = Math.max(v1.length, v2.length);
for (int i = 0; i < maxLen; i++) {
// 获取当前段的值,如果超出数组长度则视为0
int val1 = i < v1.length ? v1[i] : 0;
int val2 = i < v2.length ? v2[i] : 0;
// 比较当前段的值
if (val1 < val2) return -1;
if (val1 > val2) return 1;
}
// 所有段都相等
return 0;
}
}
七、效果展示
1、输入
1.0,1.5
2、输出
4
3、说明
第一段都是1(相同),第二段version1为0,version2为5,差值为5-0-1=4。第一个不同段之后没有其他段。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2025 B卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。