LeetCode 165. 比较版本号

题目描述

165. 比较版本号

image-20230820001814093

image-20230820001807595

思路分析

解法一:字符串分割 + 双指针(推荐)

核心思路

将两个版本号分别以 '.' 为分隔符分割成数组,然后用双指针逐段比较整数值。

关键处理

  • 两个数组长度可能不同(如 "1.0" vs "1.0.0.1"
  • 超出短版本号段数的位置,补 0 参与比较("1.0" 等价于 "1.0.0"
  • 每段转为整数比较,避免字符串直接比较的错误(如 "09" vs "9"

推导过程

  1. split("\\.") 分割两个版本号为数组 v1[]v2[]
  2. 双指针 ij 同步推进,直到两者均越界
  3. 超出范围的段取 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 字形变换 中等 字符串按规律重排
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/01343908
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!