likes
comments
collection
share

LeetCode-比较版本号

作者站长头像
站长
· 阅读数 11

算法记录

LeetCode 题目:

  给你两个版本号 version1 和 version2 ,请你比较它们。

  版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由多位数字组成,可能包含前导零。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。


说明

一、题目

  比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 1 。

  • 如果 version1 > version2 返回 1
  • 如果 version1 < version2 返回 -1
  • 除此之外返回 0

二、分析

  • 题目很长,总得要点就是说有两个以 . 拼接的字符串,现在需要我们比较他的大小,比较方法按照字典序来计算。
  • 那我们就可以将其每个部分都拆开来存放到数组中,因为每一部分可能存在前导零,直接用字符串比较不好区分,那我们就可以将其转换为数字来进行比较,这样自然就能够去除前导零的影响。
  • 还有一种情况就是数组长度不一致的问题,短的数组还必须向长的数组进行看齐,缺失的位置用零来补。也就意味着如果相同位置判断不生效的话,后续还要进行一次判断,这里的判断就只判断没有处理完的数组即可,具体的方法也比较简单的。
  • 因为是补零,因此一但是遍历第一个数组的话那么数据大于零就可以返回 1 了,,如果是第二个数组的话大于零就可以直接返回 -1
  • 上述步骤处理完函数还有没有返回的话就只有一种情况了,那就是两个字符串在这种情况下属于相等的,直接返回 0
class Solution {
    public int compareVersion(String version1, String version2) {
        String[] v1 = version1.split("\\."), v2 = version2.split("\\.");
        int index = 0;
        for(; index < v1.length && index < v2.length; index++) {
            int v1n = Integer.parseInt(v1[index]), v2n = Integer.parseInt(v2[index]);
            if(v1n > v2n) return 1;
            if(v1n < v2n) return -1;
        }
        if(index < v1.length) {
            for(; index < v1.length; index++) {
                int v1n = Integer.parseInt(v1[index]);
                if(v1n > 0) return 1;
            }
        }
        if(index < v2.length) {
            for(; index < v2.length; index++) {
                int v2n = Integer.parseInt(v2[index]);
                if(v2n > 0) return -1;
            }
        }
        return 0;
    }
}

总结

问题有点长,但是整体的难度不大,需要注意字符串拆分的时候 . 的转义。

转载自:https://juejin.cn/post/7099000893332275214
评论
请登录