LeetCode 165. 比较版本号
题目描述
思路分析
解法一:字符串分割 + 双指针(推荐)
核心思路:
将两个版本号分别以
'.'为分隔符分割成数组,然后用双指针逐段比较整数值。关键处理:
- 两个数组长度可能不同(如
"1.0"vs"1.0.0.1")- 超出短版本号段数的位置,补 0 参与比较(
"1.0"等价于"1.0.0")- 每段转为整数比较,避免字符串直接比较的错误(如
"09"vs"9")推导过程:
split("\\.")分割两个版本号为数组v1[]、v2[]- 双指针
i、j同步推进,直到两者均越界- 超出范围的段取 0,当前段差异则直接返回结果
复杂度分析:
- 时间复杂度:O(max(n, m)),其中 n、m 分别为两个版本号的修订段数
- 空间复杂度:O(n + m),存储两个分割后的数组
class Solution {
public int compareVersion(String version1, String version2) {
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
int i = 0, j = 0;
while (i < v1.length || j < v2.length) {
// 超出范围的段补 0
int n1 = i < v1.length ? Integer.parseInt(v1[i++]) : 0;
int n2 = j < v2.length ? Integer.parseInt(v2[j++]) : 0;
if (n1 > n2) {
return 1;
} else if (n1 < n2) {
return -1;
}
}
return 0;
}
}
func compareVersion(version1 string, version2 string) int {
s1 := strings.Split(version1, ".")
s2 := strings.Split(version2, ".")
p1, p2 := 0, 0
for p1 < len(s1) || p2 < len(s2) {
v1, v2 := 0, 0
// 超出范围的段补 0
if p1 < len(s1) {
v1, _ = strconv.Atoi(s1[p1])
p1++
}
if p2 < len(s2) {
v2, _ = strconv.Atoi(s2[p2])
p2++
}
if v1 > v2 {
return 1
} else if v1 < v2 {
return -1
}
}
return 0
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 8. 字符串转换整数 (atoi) | 中等 | 字符串解析 |
| 67. 二进制求和 | 简单 | 字符串逐位处理 |
| 43. 字符串相乘 | 中等 | 字符串逐位处理 |
| 415. 字符串相加 | 简单 | 字符串双指针解析 |
| 468. 验证IP地址 | 中等 | 字符串分割验证 |
| 6. N 字形变换 | 中等 | 字符串按规律重排 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!

