字符串中等1 种解法
#165比较版本号
逐段比较两个点分十进制版本号,忽略每段前导零和尾部零段。
#字符串#双指针
解题主线
01
每轮取出一个 revision;去掉前导零后先比较有效长度,再按字典序比较,可完全避免数值溢出。
解法 1:逐段字符串比较
双指针切出每个 revision,跳过前导零后比较有效位数与字符。
时间复杂度
O(m + n)
空间复杂度
O(1)
java
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