
问题描述小明和小红是两个软件开发者他们经常需要比较不同软件的版本号以确定哪个版本更新。版本号通常由多个以点分隔的数字组成例如 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 500version1 和 version2 仅包含数字和字符 .version1 和 version2 都是有效的版本号即至少包含一个数字且不以点开头或结尾且没有两个连续的点version1 和 version2 的所有修订号都可以存储在 32 位整数内即每个修订号在转换为整数后其值不超过 2^31 - 1程序代码#include stdio.h#include string.hint 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)); // 0printf(%d\n, compareVersion(1.0, 1.0.0)); // 0printf(%d\n, compareVersion(0.1, 1.1)); // -1printf(%d\n, compareVersion(1.0.1, 1)); // 1printf(%d\n, compareVersion(7.5.2.4, 7.5.3)); // -1return 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; }运行结果