友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

165. 比较版本号

给你两个 版本号字符串 version1version2,请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。

比较版本号时,请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少,则将缺失的修订号视为 0

返回规则如下:

  • 如果 version1 < version2 返回 -1

  • 如果 version1 > version2 返回 1

  • 除此之外返回 0

示例 1:

输入:version1 = "1.2", version2 = "1.10"

输出:-1

解释:

version1 的第二个修订号为 "2",version2 的第二个修订号为 "10":2 < 10,所以 version1 < version2。

示例 2:

输入:version1 = "1.01", version2 = "1.001"

输出:0

解释:

忽略前导零,"01" 和 "001" 都代表相同的整数 "1"。

示例 3:

输入:version1 = "1.0", version2 = "1.0.0.0"

输出:0

解释:

version1 有更少的修订号,每个缺失的修订号按 "0" 处理。

提示:

  • 1 <= version1.length, version2.length <= 500

  • version1version2 仅包含数字和 .

  • version1version2 都是 有效版本号

  • version1version2 的所有修订号都可以存储在 32 位整数

思路分析

双指针。一个指针指向一个字符串下标,从指针位置取一个修订号的值,然后比较,再取下一个修订号。

最简单的处理办法是使用 StringTokenizer

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-06-27 20:42:34
 */
public int compareVersion(String version1, String version2) {
  int l1 = 0;
  int l2 = 0;
  while (l1 < version1.length() || l2 < version2.length()) {
    int v1 = 0;
    int l1n = l1;
    while (l1n < version1.length() && version1.charAt(l1n) != '.') {
      l1n++;
    }
    if (l1 < l1n) {
      v1 = Integer.parseInt(version1.substring(l1, l1n));
      l1 = l1n + 1;
    }
    int v2 = 0;
    int l2n = l2;
    while (l2n < version2.length() && version2.charAt(l2n) != '.') {
      l2n++;
    }
    if (l2 < l2n) {
      v2 = Integer.parseInt(version2.substring(l2, l2n));
      l2 = l2n + 1;
    }
    int compare = Integer.compare(v1, v2);
    if (compare != 0) {
      return compare;
    }
  }
  return 0;
  //    // 最简单的的方式
  //    StringTokenizer st1 = new StringTokenizer(version1, ".");
  //    StringTokenizer st2 = new StringTokenizer(version2, ".");
  //    while (st1.hasMoreTokens() || st2.hasMoreTokens()) {
  //      int v1 = st1.hasMoreTokens() ? Integer.parseInt(st1.nextToken()) : 0;
  //      int v2 = st2.hasMoreTokens() ? Integer.parseInt(st2.nextToken()) : 0;
  //      int compare = Integer.compare(v1, v2);
  //      if (compare != 0) {
  //        return compare;
  //      }
  //    }
  //    return 0;
}