题解 | #比较版本号#

比较版本号

https://www.nowcoder.com/practice/2b317e02f14247a49ffdbdba315459e7

故事背景

假设你在玩游戏的时候,游戏会定期更新版本,比如从 1.02.11 更新到 2.14.4。这些版本号由数字和点组成,比如 1.02.11 中有三个数字:10211。我们的任务是判断两个版本号谁更大。

比较规则

  1. 从左到右逐个比较数字:
  2. 先比较最左边的数字,如果一样,再比较下一个数字,以此类推。
  3. 忽略前导零:
  4. 比如 01 和 1 是一样的,我们只需要比较 1。
  5. 缺少的数字视为0:
  6. 如果一个版本号少了一个数字,那么这个数字就认为是 0。比如 1.1 小于 1.1.1,因为 1.1 相当于 1.1.0。

解题步骤

  1. 准备两个指针:
  2. 一个指针 i 指向版本号 version1 的第一个字符。
  3. 另一个指针 j 指向版本号 version2 的第一个字符。
  4. 逐个比较数字:
  5. 每次找到一个数字,直到遇到 . 或者字符串的结尾。
  6. 把找到的数字加起来,忽略前面的零。
  7. 比较这两个数字,如果不一样,就知道谁更大。
  8. 如果一样,继续找下一个数字。
  9. 处理缺少的数字:
  10. 如果一个版本号的数字已经全部比较完了,但另一个还有剩余,剩下的数字都当作 0 来比较。
  11. 最后的结果:
  12. 如果 version1 更大,返回 1。如果 version2 更大,返回 -1。如果两者一样,返回 0。

示例代码

以下是简单的java实现:

public class VersionComparator {

    /**
     * 比较两个版本号
     * @param version1 版本号1
     * @param version2 版本号2
     * @return 比较结果
     */
    public int compareVersion(String version1, String version2) {
        int i = 0, j = 0; // 初始化指针
        int len1 = version1.length(), len2 = version2.length(); // 版本号长度

        // 循环直到两个指针都到达各自字符串的末尾
        while (i < len1 || j < len2) {
            int num1 = 0, num2 = 0;

            // 读取 version1 的修订号
            while (i < len1 && version1.charAt(i) != '.') {
                // 忽略前导零
                if (version1.charAt(i) != '0') {
                    num1 = num1 * 10 + (version1.charAt(i) - '0');
                }
                i++;
            }
            i++; // 跳过 '.'
            
            // 读取 version2 的修订号
            while (j < len2 && version2.charAt(j) != '.') {
                // 忽略前导零
                if (version2.charAt(j) != '0') {
                    num2 = num2 * 10 + (version2.charAt(j) - '0');
                }
                j++;
            }
            j++; // 跳过 '.'

            // 比较修订号
            if (num1 > num2) {
                return 1;
            } else if (num1 < num2) {
                return -1;
            }
        }

        return 0; // 修订号完全相同
    }
}

代码解释

  1. 初始化指针:
  2. i 和 j 分别指向 version1 和 version2 的当前位置。
  3. 读取修订号:
  4. 使用循环逐个读取修订号,直到遇到 . 或者到达字符串末尾。
  5. 使用 num1 和 num2 存储当前读取的修订号。
  6. 忽略前导零,只有不是 0 的字符才参与计算。
  7. 比较修订号:
  8. 如果 num1 和 num2 不同,直接返回比较结果。
  9. 跳过 .:
  10. 在读取完修订号之后,跳过 . 符号。
  11. 退出条件:
  12. 当 i 和 j 都到达各自字符串的末尾时,返回 0(修订号完全相同)。

测试结果

  • 输入:"1.1", "2.1"
  • 输出:-1
  • 输入:"1.1", "1.01"
  • 输出:0
  • 输入:"1.1", "1.1.1"
  • 输出:-1
  • 输入:"2.0.1", "2"
  • 输出:1
  • 输入:"0.226", "0.36"
  • 输出:1

如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务