diff options
Diffstat (limited to 'compare_version_num.c')
-rw-r--r-- | compare_version_num.c | 86 |
1 files changed, 22 insertions, 64 deletions
diff --git a/compare_version_num.c b/compare_version_num.c index eaa3fed..77f2852 100644 --- a/compare_version_num.c +++ b/compare_version_num.c @@ -11,74 +11,32 @@ * version2' return -1, if 'version1 > version2' return 1, otherwise, return 0 */ -int count_dot(char *s, int n) { - int dot = 0; - for (int i = 0; i < n; i++) - if (s[i] == '.') - dot++; - return dot; -} - -void helper(char *s, int n, int *data) { - int val = 0, idx = 0; - for (int i = 0; i < n; i++) - if (s[i] == '.') { - data[idx] = val; - idx++; - val = 0; - } else { - val = val * 10 + s[i] - '0'; - } - data[idx] = val; -} - int compareVersion(char *version1, char *version2) { - int n1 = strlen(version1), n2 = strlen(version2); - int p1 = 0, p2 = 0, ans = 0; - int item1 = count_dot(version1, n1) + 1; - int item2 = count_dot(version2, n2) + 1; - int *data1 = (int *)malloc(item1 * sizeof(int)); - int *data2 = (int *)malloc(item2 * sizeof(int)); - helper(version1, n1, data1); - helper(version2, n2, data2); - while (p1 < item1 || p2 < item2) { - if (p1 == item1) { - for (int i = p2; i < item2; i++) - if (!data2[i]) { - ans = -1; - goto exit; - } - ans = 0; - goto exit; - } else if (p2 == item2) { - for (int i = p1; i < item1; i++) - if (!data1[i]) { - ans = 1; - goto exit; - } - ans = 0; - goto exit; - } else { - if (data1[p1] > data2[p2]) { - ans = 1; - goto exit; - } - if (data1[p1] < data2[p2]) { - ans = -1; - goto exit; - } - p1++, p2++; - } + int i = 0, j = 0, num1 = 0, num2 = 0; + int n = strlen(version1), m = strlen(version2); + while (i < n || j < m) { + while (i < n && version1[i] != '.') + num1 = num1 * 10 + (version1[i++] - '0'); + while (j < m && version2[j] != '.') + num2 = num2 * 10 + (version2[j++] - '0'); + if (num1 > num2) + return 1; + else if (num1 < num2) + return -1; + num1 = num2 = 0; + if (i < n) + i++; + if (j < m) + j++; } -exit: - free(data1), free(data2); - return ans; + return 0; } int main() { - char *v11 = "1.01", *v21 = "1.001", *v12 = "1.0", *v22 = "1.0.0", - *v13 = "0.1", *v23 = "1.1"; - printf("%d\n", compareVersion(v11, v21)); // expect: 0 + char *v11 = "1.2", *v21 = "1.10"; + char *v12 = "1.01", *v22 = "1.001"; + char *v13 = "1.0", *v23 = "1.0.0.0"; + printf("%d\n", compareVersion(v11, v21)); // expect: -1 printf("%d\n", compareVersion(v12, v22)); // expect: 0 - printf("%d\n", compareVersion(v13, v23)); // expect: -1 + printf("%d\n", compareVersion(v13, v23)); // expect: 0 } |