题解 | #比较版本号#

比较版本号

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

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

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

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

全部评论

相关推荐

勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务