|
|
@@ -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;
|
|
|
+}
|