华为OD机试 - 版本管理 - 数组(Java 2025 B卷 100分)

在这里插入图片描述

华为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. 版本号由数字和点组成,且至少包含一个数字。
  2. 点不会作为数字的开始或结束,也不会连续出现。
  3. 每个数字部分的数字值可能不等(例如 1.01 和 1.001视为相同)。
  4. 两个字符串中间以英文逗号分隔。

三、输出描述

输出一个整数,表示可用版本号的个数。具体规则如下:

如果 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。

五、解题思路

  1. 将字符串版本号按点号分割,转换为整数数组
  2. 逐段比较版本号大小,处理不等长的情况
  3. 找到第一个不同段后,检查后续段是否都为0,然后计算差值
  4. 正确处理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算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值