问题描述
小明和小红是两个软件开发者,他们经常需要比较不同软件的版本号以确定哪个版本更新。版本号通常由多个以点分隔的数字组成,例如 "1.2.3" 或 "2.0"。现在,他们需要你设计一个算法来比较两个版本号 version1 和 version2。
要求:
- 如果 version1 > version2,返回 1。
- 如果 version1 < version2,返回 -1。
- 如果 version1 等于 version2,返回 0。
- 版本号可能包含前导零,例如 "1.01" 应被视为 "1.1",但忽略前导零后进行比较。具体来说,你需要将每个修订号(即点分隔的每个部分)转换为整数后再进行比较,这样可以忽略前导零的影响。
- 如果某个版本号的段数较少,则在比较时将其缺失的部分视为 0,例如 "1.0" 和 "1.0.0" 是相等的。
测试样例
样例1:
输入:version1 = "1.01", version2 = "1.001" 输出:0 解释:将每个修订号转换为整数后,version1 变为 [1, 1],version2 变为 [1, 1],因此两者相等。
样例2:
输入:version1 = "1.0", version2 = "1.0.0" 输出:0 解释:将每个修订号转换为整数后,version1 变为 [1, 0],version2 变为 [1, 0, 0]。比较时,将 version1 缺失的部分视为 0,因此实际比较的是 [1, 0, 0] 和 [1, 0, 0],两者相等。
样例3:
输入:version1 = "0.1", version2 = "1.1" 输出:-1 解释:将每个修订号转换为整数后,version1 变为 [0, 1],version2 变为 [1, 1]。第一个修订号 0 < 1,因此 version1 小于 version2。
样例4:
输入:version1 = "1.0.1", version2 = "1" 输出:1 解释:将每个修订号转换为整数后,version1 变为 [1, 0, 1],version2 变为 [1]。比较时,将 version2 缺失的部分视为 0,因此实际比较的是 [1, 0, 1] 和 [1, 0, 0]。第三个修订号 1 > 0,因此 version1 大于 version2。
样例5:
输入:version1 = "7.5.2.4", version2 = "7.5.3" 输出:-1 解释:将每个修订号转换为整数后,version1 变为 [7, 5, 2, 4],version2 变为 [7, 5, 3]。前两个修订号相同,第三个修订号 2 < 3,因此 version1 小于 version2。
约束条件
- 1 <= version1.length, version2.length <= 500
- version1 和 version2 仅包含数字和字符 '.'
- version1 和 version2 都是有效的版本号(即至少包含一个数字,且不以点开头或结尾,且没有两个连续的点)
- version1 和 version2 的所有修订号都可以存储在 32 位整数内(即每个修订号在转换为整数后,其值不超过 2^31 - 1)
程序代码
#include <stdio.h>
#include <string.h>
int compareVersion(char* version1, char* version2) {
int len1 = strlen(version1);
int len2 = strlen(version2);
int i = 0, j = 0;
while (i < len1 || j < len2) {
// 解析 version1 当前段
int num1 = 0;
while (i < len1 && version1[i] != '.') {
num1 = num1 * 10 + (version1[i] - '0');
i++;
}
if (i < len1 && version1[i] == '.') i++; // 跳过 '.'
// 解析 version2 当前段
int num2 = 0;
while (j < len2 && version2[j] != '.') {
num2 = num2 * 10 + (version2[j] - '0');
j++;
}
if (j < len2 && version2[j] == '.') j++; // 跳过 '.'
// 比较当前段
if (num1 > num2) return 1;
if (num1 < num2) return -1;
}
return 0;
}
int main() {
printf("%d\n", compareVersion("1.01", "1.001")); // 0
printf("%d\n", compareVersion("1.0", "1.0.0")); // 0
printf("%d\n", compareVersion("0.1", "1.1")); // -1
printf("%d\n", compareVersion("1.0.1", "1")); // 1
printf("%d\n", compareVersion("7.5.2.4", "7.5.3")); // -1
return 0;
}
#include <stdio.h> #include <string.h> int compareVersion(char* version1, char* version2) { int len1 = strlen(version1); int len2 = strlen(version2); int i = 0, j = 0; while (i < len1 || j < len2) { // 解析 version1 当前段 int num1 = 0; while (i < len1 && version1[i] != '.') { num1 = num1 * 10 + (version1[i] - '0'); i++; } if (i < len1 && version1[i] == '.') i++; // 跳过 '.' // 解析 version2 当前段 int num2 = 0; while (j < len2 && version2[j] != '.') { num2 = num2 * 10 + (version2[j] - '0'); j++; } if (j < len2 && version2[j] == '.') j++; // 跳过 '.' // 比较当前段 if (num1 > num2) return 1; if (num1 < num2) return -1; } return 0; } int main() { printf("%d\n", compareVersion("1.01", "1.001")); // 0 printf("%d\n", compareVersion("1.0", "1.0.0")); // 0 printf("%d\n", compareVersion("0.1", "1.1")); // -1 printf("%d\n", compareVersion("1.0.1", "1")); // 1 printf("%d\n", compareVersion("7.5.2.4", "7.5.3")); // -1 return 0; }