Parcourir la source

Adding solution 2903

Vinicius Teshima il y a 2 semaines
Parent
commit
000cb1da6f
1 fichiers modifiés avec 89 ajouts et 0 suppressions
  1. 89 0
      C/2903.c

+ 89 - 0
C/2903.c

@@ -0,0 +1,89 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+/**
+ * Note: The returned array must be malloced, assume caller calls free().
+ */
+int *
+findIndices(int* nums, int numsSize, int indexDifference, int valueDifference, int* returnSize)
+{
+    int *ret = malloc(2*sizeof(int));
+    ret[0] = -1;
+    ret[1] = -1;
+
+    for ( int i = 0; i < numsSize; ++i ) {
+        for ( int j = i; j < numsSize; ++j ) {
+            if ( abs(i-j) < indexDifference ) { continue; }
+            if ( abs(nums[i]-nums[j]) < valueDifference ) { continue; }
+            ret[0] = i;
+            ret[1] = j;
+            goto exit;
+        }
+    }
+
+exit:
+    *returnSize = 2;
+    return ret;
+}
+
+char *
+list_to_cstr_temp(int *nums, int numsSize)
+{
+    char *data = NULL;
+    unsigned long size = 0;
+    unsigned long cap = 1024;
+
+    size = 0;
+    if ( data == NULL ) { data = malloc(cap * sizeof(*data)); }
+    memset(data, 0, cap);
+
+    data[size++] = '[';
+    for ( int i = 0; i < numsSize; ++i ) {
+        if ( size + 2 >= cap ) { cap *= 2; data = realloc(data, cap); }
+        if ( i > 0 ) { data[size++] = ','; }
+        data[size++] = nums[i] + '0';
+    }
+    data[size++] = ']';
+    data[size++] = '\0';
+
+    return data;
+}
+
+void
+r(int *nums, int numsSize, int indexDifference, int valueDifference, int *exp)
+{
+    int t;
+    char *numsCstr = list_to_cstr_temp(nums, numsSize);
+    int *ret = findIndices(nums, numsSize, indexDifference, valueDifference, &t);
+    char *retCstr = list_to_cstr_temp(ret, 2);
+    char *expCstr = list_to_cstr_temp(exp, 2);
+    printf("findIndices(%s, %d, %d, %d) = %s | exp: %s\n",
+           numsCstr, numsSize, indexDifference, valueDifference,
+           retCstr,
+           expCstr);
+
+    free(numsCstr);
+    free(ret);
+    free(retCstr);
+    free(expCstr);
+}
+
+int
+main(void)
+{
+    int nums1[] = {5,1,4,1};
+    int exp1[] = {0,3};
+    r(nums1, 4, 2, 4, exp1);
+
+    int nums2[] = {2,1};
+    int exp2[] = {0,0};
+    r(nums2, 2, 0, 0, exp2);
+
+    int nums3[] = {1,2,3};
+    int exp3[] = {-1,-1};
+    r(nums3, 3, 2, 4, exp3);
+
+    return 0;
+}