165.比较版本号
165.1 题目
给你两个版本号字符串 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 位整数 中
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