2903.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. /**
  6. * Note: The returned array must be malloced, assume caller calls free().
  7. */
  8. int *
  9. findIndices(int* nums, int numsSize, int indexDifference, int valueDifference, int* returnSize)
  10. {
  11. int *ret = malloc(2*sizeof(int));
  12. ret[0] = -1;
  13. ret[1] = -1;
  14. for ( int i = 0; i < numsSize; ++i ) {
  15. for ( int j = i; j < numsSize; ++j ) {
  16. if ( abs(i-j) < indexDifference ) { continue; }
  17. if ( abs(nums[i]-nums[j]) < valueDifference ) { continue; }
  18. ret[0] = i;
  19. ret[1] = j;
  20. goto exit;
  21. }
  22. }
  23. exit:
  24. *returnSize = 2;
  25. return ret;
  26. }
  27. char *
  28. list_to_cstr_temp(int *nums, int numsSize)
  29. {
  30. char *data = NULL;
  31. unsigned long size = 0;
  32. unsigned long cap = 1024;
  33. size = 0;
  34. if ( data == NULL ) { data = malloc(cap * sizeof(*data)); }
  35. memset(data, 0, cap);
  36. data[size++] = '[';
  37. for ( int i = 0; i < numsSize; ++i ) {
  38. if ( size + 2 >= cap ) { cap *= 2; data = realloc(data, cap); }
  39. if ( i > 0 ) { data[size++] = ','; }
  40. data[size++] = nums[i] + '0';
  41. }
  42. data[size++] = ']';
  43. data[size++] = '\0';
  44. return data;
  45. }
  46. void
  47. r(int *nums, int numsSize, int indexDifference, int valueDifference, int *exp)
  48. {
  49. int t;
  50. char *numsCstr = list_to_cstr_temp(nums, numsSize);
  51. int *ret = findIndices(nums, numsSize, indexDifference, valueDifference, &t);
  52. char *retCstr = list_to_cstr_temp(ret, 2);
  53. char *expCstr = list_to_cstr_temp(exp, 2);
  54. printf("findIndices(%s, %d, %d, %d) = %s | exp: %s\n",
  55. numsCstr, numsSize, indexDifference, valueDifference,
  56. retCstr,
  57. expCstr);
  58. free(numsCstr);
  59. free(ret);
  60. free(retCstr);
  61. free(expCstr);
  62. }
  63. int
  64. main(void)
  65. {
  66. int nums1[] = {5,1,4,1};
  67. int exp1[] = {0,3};
  68. r(nums1, 4, 2, 4, exp1);
  69. int nums2[] = {2,1};
  70. int exp2[] = {0,0};
  71. r(nums2, 2, 0, 0, exp2);
  72. int nums3[] = {1,2,3};
  73. int exp3[] = {-1,-1};
  74. r(nums3, 3, 2, 4, exp3);
  75. return 0;
  76. }