题目描述
某产品的版本号命名规则为若干段数字,多段数字之间用点 .
连接,如:1, 1.0, 1.2.03.04.56。
现给定一个新版本,当已发布版本比新版本低时需要升级,请统计需要升级的版本数量。
新版本和已发布版本比较规则:
以点为分隔符将版本号拆分为多个段,从左到右分别比较多个段;相同段位置的数字越大,版本越高;若第一段数
字相同,比较第二段,以此类推;如果比到最后两个版本的段数不一样,那么短的版本更小。
版本 1.0, 1.0.0.0, 1.00.00 均可能出现,统计时视为不同版本。
解答要求
时间限制:1000ms, 内存限制:256MB
输入
第一行一个整数,表示已发布版本号的个数,取值范围:[0,10];
第二行字符串表示已发布版本号,多个版本号以单空格分隔开,字符串长度范围:[0,50);
第三行是给定的新版本号。
已发布版本列表中无重复版本号;
版本号每段值的范围:[0,2^31];
输出
一个整数,表示需要升级的版本数
样例
输入样例 1 复制
7
100.200 20.500 100.5 100.05.0 0.0.0.0 100.50.1 100.50.0
100.50
输出样例 1
4
提示样例 1
已发布版本逐个与新版本100.50比较:
已发布版本 0.0.0.0、20.500 的第一段值都小于新版本的第一段值100,因此这2个版本需要升级;
已发布版本100.5、100.05.0 的第一段与新版本相同,第二段(值为 5 )小于新版本的第二段(值为50),因此这2个版本需要升级。
100.200的第二段大于新版本;100.50.1、100.50.0的前两段与新版本相同,但存在第三段,视为更大;因此这些版本都不需要升级。
共有4个版本需要升级。
输入样例 2
0
5.0.0
输出样例 2
0
已发布版本为空,所以需要升级的版本数为 0
提示
答题要求:您编写的代码需要符合CleanCode的要求(包括通用编码规范、安全编码规范和圈复杂度)
编码实现(java)
public static void main(String[] args) {
String[] oldVersions = new String[]{"100.200", "20.500", "100.5", "100.05.0", "0.0.0.0", "100.50.1", "100.50.0"};
int result = compareVersions(oldVersions, "100.50");
System.out.println(result);
}
private static int compareVersions(String[] oldVersions, String newVersion) {
int upgradeCount = 0;
for (String oldVersion : oldVersions) {
String[] v1 = oldVersion.split("\\.");
String[] v2 = newVersion.split("\\.");
int n1 = v1.length;
int n2 = v2.length;
int maxLength = Math.max(n1, n2);
for (int i = 0; i < maxLength; i++) {
int num1 = i < n1 ? Integer.parseInt(v1[i]) : -1;
int num2 = i < n2 ? Integer.parseInt(v2[i]) : -1;
if (num1 < num2) {
upgradeCount++;
break;
} else if (num1 > num2) {
break;
}
}
}
return upgradeCount;
}
输出结果
4
Process finished with exit code 0