返回

剖析版本之争:双指针算法巧解比较版本号

前端

在软件开发中,版本号是衡量软件演进历程的重要标杆。版本号的比较看似简单,但蕴含着不少算法巧思。在本文中,我们将探讨一种经典算法——双指针算法,用于解决 LeetCode 题库中的「165. 比较版本号」难题,深入理解版本号比较的奥秘。

一、题目概述

「165. 比较版本号」

给定两个版本号 version1 和 version2,请比较它们的版本大小。

版本号由一系列非负整数组成,用点'.'分隔。每个非负整数表示该部分的版本号。例如,版本号 "1.0.1" 表示第一个部分的版本号为 1,第二个部分的版本号为 0,第三个部分的版本号为 1。

比较规则如下:

  • 如果 version1 > version2,返回 1。
  • 如果 version1 < version2,返回 -1。
  • 如果 version1 = version2,返回 0。

例如:

输入:version1 = "1.0.1", version2 = "1.1.0"
输出:-1
解释:version1 的第二个部分版本号为 0,而 version2 的第二个部分版本号为 1。因此,version1 < version2
输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 和 version2 的所有部分版本号都相同。因此,version1 = version2

二、双指针算法解析

双指针算法 是一种遍历算法,其特点是使用两个或多个指针同时遍历数据结构。在「165. 比较版本号」问题中,我们可以使用两个指针分别遍历 version1 和 version2 的部分版本号,然后逐个比较。

具体步骤如下:

  1. 将 version1 和 version2 分别拆分成一个部分版本号数组。
  2. 初始化两个指针,分别指向 version1 和 version2 的第一个部分版本号。
  3. 循环比较这两个指针指向的部分版本号。
  4. 如果 version1 的指针指向的部分版本号大于 version2 的指针指向的部分版本号,则返回 1。
  5. 如果 version1 的指针指向的部分版本号小于 version2 的指针指向的部分版本号,则返回 -1。
  6. 如果两个指针都指向了最后一个部分版本号,则返回 0。

三、代码实现

Java 代码:

public class VersionCompare {

    public int compareVersion(String version1, String version2) {
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");

        int i = 0;
        int j = 0;

        while (i < v1.length || j < v2.length) {
            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;
            } else {
                i++;
                j++;
            }
        }

        return 0;
    }
}

Python 代码:

def compareVersion(version1, version2):
    v1 = version1.split(".")
    v2 = version2.split(".")

    i = 0
    j = 0

    while i < len(v1) or j < len(v2):
        n1 = int(v1[i]) if i < len(v1) else 0
        n2 = int(v2[j]) if j < len(v2) else 0

        if n1 > n2:
            return 1
        elif n1 < n2:
            return -1
        else:
            i += 1
            j += 1

    return 0

四、总结

本文详细介绍了双指针算法在 LeetCode 题库「165. 比较版本号」问题中的应用,深入剖析了算法原理和代码实现细节。通过使用两个指针同时遍历两个版本号,我们可以高效地比较其大小。掌握双指针算法,可以解决更多涉及数组和字符串比较的算法问题。