165.比较版本号

  1. 165.比较版本号
    1. 165.1 题目
    2. 165.2 题解
      1. 使用 Split 和 Parse 方法进行比较
      2. 手动比较版本号字符串
    3. 165.3 代码
    4. 165.4 运行结果

165.比较版本号


165.1 题目

给你两个版本号字符串 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 位整数 中

165.2 题解

使用 Split 和 Parse 方法进行比较

// 方法一:使用 Split 和 Parse 方法进行比较
static int CompareVersions1(string version1, string version2)
{
    // 将版本号按 '.' 分割为字符串数组
    string[] parts1 = version1.Split('.');
    string[] parts2 = version2.Split('.');

    // 获取两个版本号的修订号数组的最大长度
    int maxLength = Math.Max(parts1.Length, parts2.Length);

    // 遍历比较每个修订号
    for (int i = 0; i < maxLength; i++)
    {
        // 将版本号转换为整数,忽略前导零
        int num1 = i < parts1.Length ? int.Parse(parts1[i]) : 0;
        int num2 = i < parts2.Length ? int.Parse(parts2[i]) : 0;

        // 比较修订号
        if (num1 < num2)
            return -1;
        if (num1 > num2)
            return 1;
    }

    // 如果所有修订号都相等,则返回 0
    return 0;
}

手动比较版本号字符串

// 方法二:手动比较版本号字符串
static int CompareVersions2(string version1, string version2)
{
    int index1 = 0, index2 = 0;

    // 循环比较版本号
    while (index1 < version1.Length || index2 < version2.Length)
    {
        // 获取当前修订号的数值
        int num1 = 0, num2 = 0;

        // 获取 version1 当前修订号的数值
        while (index1 < version1.Length && version1[index1] != '.')
        {
            num1 = num1 * 10 + (version1[index1] - '0');
            index1++;
        }

        // 获取 version2 当前修订号的数值
        while (index2 < version2.Length && version2[index2] != '.')
        {
            num2 = num2 * 10 + (version2[index2] - '0');
            index2++;
        }

        // 比较当前修订号
        if (num1 < num2)
            return -1;
        if (num1 > num2)
            return 1;

        // 跳过当前的 '.'
        index1++;
        index2++;
    }

    // 如果所有修订号都相等,则返回 0
    return 0;
}

165.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你两个版本号字符串 version1 和 version2,请你比较它们。
        // 版本号由被点 '.' 分开的修订号组成。修订号的值是它转换为整数并忽略前导零。
        // 按从左到右的顺序依次比较它们的修订号。如果其中一个版本字符串的修订号较少,则将缺失的修订号视为 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
        // version1 和 version2 仅包含数字和 '.'
        // version1 和 version2 都是有效版本号
        // version1 和 version2 的所有修订号都可以存储在 32 位整数 中

        #endregion

        #region 测试

        // 示例 1
        string version1_1 = "1.2";
        string version2_1 = "1.10";
        int result1 = CompareVersions1(version1_1, version2_1);
        Console.WriteLine($"示例1 方法1 输出:{result1}");
        int result2 = CompareVersions2(version1_1, version2_1);
        Console.WriteLine($"示例1 方法2 输出:{result2}");

        // 示例 2
        string version1_2 = "1.01";
        string version2_2 = "1.001";
        int result3 = CompareVersions1(version1_2, version2_2);
        Console.WriteLine($"示例2 方法1 输出:{result3}");
        int result4 = CompareVersions2(version1_2, version2_2);
        Console.WriteLine($"示例2 方法2 输出:{result4}");

        // 示例 3
        string version1_3 = "1.0";
        string version2_3 = "1.0.0.0";
        int result5 = CompareVersions1(version1_3, version2_3);
        Console.WriteLine($"示例3 方法1 输出:{result5}");
        int result6 = CompareVersions2(version1_3, version2_3);
        Console.WriteLine($"示例3 方法2 输出:{result6}");

        #endregion
    }

    #region 答案

    // 方法一:使用 Split 和 Parse 方法进行比较
    static int CompareVersions1(string version1, string version2)
    {
        // 将版本号按 '.' 分割为字符串数组
        string[] parts1 = version1.Split('.');
        string[] parts2 = version2.Split('.');

        // 获取两个版本号的修订号数组的最大长度
        int maxLength = Math.Max(parts1.Length, parts2.Length);

        // 遍历比较每个修订号
        for (int i = 0; i < maxLength; i++)
        {
            // 将版本号转换为整数,忽略前导零
            int num1 = i < parts1.Length ? int.Parse(parts1[i]) : 0;
            int num2 = i < parts2.Length ? int.Parse(parts2[i]) : 0;

            // 比较修订号
            if (num1 < num2)
                return -1;
            if (num1 > num2)
                return 1;
        }

        // 如果所有修订号都相等,则返回 0
        return 0;
    }

    // 方法二:手动比较版本号字符串
    static int CompareVersions2(string version1, string version2)
    {
        int index1 = 0, index2 = 0;

        // 循环比较版本号
        while (index1 < version1.Length || index2 < version2.Length)
        {
            // 获取当前修订号的数值
            int num1 = 0, num2 = 0;

            // 获取 version1 当前修订号的数值
            while (index1 < version1.Length && version1[index1] != '.')
            {
                num1 = num1 * 10 + (version1[index1] - '0');
                index1++;
            }

            // 获取 version2 当前修订号的数值
            while (index2 < version2.Length && version2[index2] != '.')
            {
                num2 = num2 * 10 + (version2[index2] - '0');
                index2++;
            }

            // 比较当前修订号
            if (num1 < num2)
                return -1;
            if (num1 > num2)
                return 1;

            // 跳过当前的 '.'
            index1++;
            index2++;
        }

        // 如果所有修订号都相等,则返回 0
        return 0;
    }

    #endregion
}

165.4 运行结果

示例1 方法1 输出:-1
示例1 方法2 输出:-1
示例2 方法1 输出:0
示例2 方法2 输出:0
示例3 方法1 输出:0
示例3 方法2 输出:0


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏