字符串中等1 种解法

#165比较版本号

逐段比较两个点分十进制版本号,忽略每段前导零和尾部零段。

#字符串#双指针

解题主线

01

每轮取出一个 revision;去掉前导零后先比较有效长度,再按字典序比较,可完全避免数值溢出。

解法 1逐段字符串比较

双指针切出每个 revision,跳过前导零后比较有效位数与字符。

时间复杂度

O(m + n)

空间复杂度

O(1)

165. 比较版本号 · 逐段字符串比较
final class Solution {
    public int compareVersion(String version1, String version2) {
        int first = 0;
        int second = 0;
        while (first < version1.length() || second < version2.length()) {
            int firstEnd = nextDot(version1, first);
            int secondEnd = nextDot(version2, second);
            while (first < firstEnd && version1.charAt(first) == '0') first++;
            while (second < secondEnd && version2.charAt(second) == '0') second++;

            int firstLength = firstEnd - first;
            int secondLength = secondEnd - second;
            if (firstLength != secondLength) return firstLength > secondLength ? 1 : -1;
            for (int offset = 0; offset < firstLength; offset++) {
                char left = version1.charAt(first + offset);
                char right = version2.charAt(second + offset);
                if (left != right) return left > right ? 1 : -1;
            }
            first = firstEnd + 1;
            second = secondEnd + 1;
        }
        return 0;
    }

    private int nextDot(String version, int start) {
        int index = start;
        while (index < version.length() && version.charAt(index) != '.') index++;
        return index;
    }
}

双指针切出每个 revision,跳过前导零后比较有效位数与字符。

  • 以字符串段比较替换旧 parseInt,消除 revision 超出 int 范围的风险。

边界与易错点

  • 旧实现 Integer.parseInt 在超长 revision 上可能溢出;字符串比较不依赖数值类型范围。
  • 缺失的尾部 revision 等价于 0。
  • 不能直接按整个版本字符串做字典序比较,例如 1.10 大于 1.2。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

medium/Q165_compareVersion.java