aboutsummaryrefslogtreecommitdiff
path: root/compare_version_num.c
diff options
context:
space:
mode:
authorJack Sangdahl <[email protected]>2025-09-22 20:24:54 -0600
committerJack Sangdahl <[email protected]>2025-09-22 20:24:54 -0600
commitb805e692752ded03241e2f000da61f9760901f57 (patch)
tree5924bb8f24ed4cf354f30481601dcdcd485f87d6 /compare_version_num.c
parent844c8a0bbcb890ec4ddd5ef485b767b00b44a78f (diff)
downloadleetcode-b805e692752ded03241e2f000da61f9760901f57.tar.gz
leetcode-b805e692752ded03241e2f000da61f9760901f57.zip
165. compare version numbers
Diffstat (limited to 'compare_version_num.c')
-rw-r--r--compare_version_num.c86
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
}