题解 | #比较版本号#
比较版本号
https://www.nowcoder.com/practice/2b317e02f14247a49ffdbdba315459e7
故事背景
假设你在玩游戏的时候,游戏会定期更新版本,比如从 1.02.11
更新到 2.14.4
。这些版本号由数字和点组成,比如 1.02.11
中有三个数字:1
、02
和 11
。我们的任务是判断两个版本号谁更大。
比较规则
- 从左到右逐个比较数字:
- 先比较最左边的数字,如果一样,再比较下一个数字,以此类推。
- 忽略前导零:
- 比如 01 和 1 是一样的,我们只需要比较 1。
- 缺少的数字视为0:
- 如果一个版本号少了一个数字,那么这个数字就认为是 0。比如 1.1 小于 1.1.1,因为 1.1 相当于 1.1.0。
解题步骤
- 准备两个指针:
- 一个指针 i 指向版本号 version1 的第一个字符。
- 另一个指针 j 指向版本号 version2 的第一个字符。
- 逐个比较数字:
- 每次找到一个数字,直到遇到 . 或者字符串的结尾。
- 把找到的数字加起来,忽略前面的零。
- 比较这两个数字,如果不一样,就知道谁更大。
- 如果一样,继续找下一个数字。
- 处理缺少的数字:
- 如果一个版本号的数字已经全部比较完了,但另一个还有剩余,剩下的数字都当作 0 来比较。
- 最后的结果:
- 如果 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; // 修订号完全相同 } }
代码解释
- 初始化指针:
- i 和 j 分别指向 version1 和 version2 的当前位置。
- 读取修订号:
- 使用循环逐个读取修订号,直到遇到 . 或者到达字符串末尾。
- 使用 num1 和 num2 存储当前读取的修订号。
- 忽略前导零,只有不是 0 的字符才参与计算。
- 比较修订号:
- 如果 num1 和 num2 不同,直接返回比较结果。
- 跳过 .:
- 在读取完修订号之后,跳过 . 符号。
- 退出条件:
- 当 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
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。
#牛客创作赏金赛#小学生都能看懂的算法 文章被收录于专栏
主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。