✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
Maven版本号定义,<主版本>.<次版本><增量版本>-<里程碑版本>
举例3.1.4-beta 其中,主版本和次版本都是必须的,主版本,次版本,增量版本由多位数字组成,可能包含前导零,里程碑版本由字符串组成。
<主版本>.<次版本>增量版本>:基于数字比较
里程碑版本:基于字符串比较,采用字典序。
比较版本号时,按从左到右的顺序依次比较。
基于数字比较,只需比较忽略任何前导零后的整数值,输入2个版本号,输出最大版本号。
2. 输入描述
输入2个版本号,换行分割,每个版本的最大长度小于50。
3. 输出描述
版本号相同时输出第一个输入版本号。
补充说明:
主版本,次版本,增量版本:
基于字符串比较,比如:
1.5>1.4>1.3.11>1.3.9
里程碑版本:基于字符串比较,比如:
1.2-beta-3>1.2-beta-11
4. Java算法源码
/**
* 获取最大软件版本号
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line1 = sc.nextLine();
String line2 = sc.nextLine();
String[] arr1 = line1.split("\\.");
int len1 = arr1.length;
String[] arr2 = line2.split("\\.");
int len2 = arr2.length;
int len = Math.min(len1, len2);
for (int i = 0; i < len; i++) {
int value1 = getValue(arr1[0]);
int value2 = getValue(arr2[0]);
if (value1 == value2) {
continue;
}
if (value1 > value2) {
System.out.println(line1);
} else {
System.out.println(line2);
}
return;
}
if (len1 >= len2) {
System.out.println(line1);
} else {
System.out.println(line2);
}
}
public static int getValue(String val) {
boolean hasZero = val.contains("0");
int index = -1;
if (hasZero) {
char[] arr = val.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
continue;
} else {
index = i;
break;
}
}
}
int num;
if (index == -1) {
num = 0;
} else {
num = Integer.parseInt(val.substring(index));
}
return num;
}
5. 测试
6.解题思路
- 首先读取输入的两个版本号字符串
line1
和line2
。 - 使用正则表达式 “.” 将版本号字符串分割成数组。
- 获取分割后的数组的长度,分别记为
len1
和len2
。 - 将两个版本号的长度进行比较,取较小的长度作为循环次数,记为
len
。 - 在循环中,依次比较对应位置的版本号值:
- 获取当前位置的版本号值,调用
getValue
方法。 - 如果两个版本号值相等,则继续比较下一个位置。
- 如果第一个版本号值大于第二个版本号值,则输出第一个版本号并返回。
- 如果第二个版本号值大于第一个版本号值,则输出第二个版本号并返回。
- 获取当前位置的版本号值,调用
- 如果循环结束后,两个版本号的前缀部分完全相等,则根据长度比较输出较长的版本号。
- 如果第一个版本号的长度大于等于第二个版本号的长度,则输出第一个版本号。
- 如果第二个版本号的长度大于第一个版本号的长度,则输出第二个版本号。