【HUAWEI OJ 题库】版本升级II

题目描述

某产品的版本号命名规则为若干段数字,多段数字之间用点 . 连接,如: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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值