Учитывая массив целых чисел, вернуть индексы двух чисел так, чтобы они складывались до определенной цели.
Вот весь мой файл:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int* twosum(int* nums, int nums_size, int sum);
int main(int argc, char** argv) {
if (argc != 3) {
printf("Two arguments required.\n");
return EXIT_FAILURE;
}
int nums_buffer_size = 10;
int nums_actual_size = 0;
int* nums = malloc(sizeof(int) * nums_buffer_size);
char* charred_num = NULL;
char delim = ',';
while ((charred_num = strsep(&argv[1], &delim)) != NULL) {
nums[nums_actual_size] = atoi(charred_num);
++nums_actual_size;
if (nums_buffer_size <= nums_actual_size) {
nums_buffer_size = nums_buffer_size * 2;
nums = realloc(nums, sizeof(int) * nums_buffer_size);
}
}
int* indices = twosum(nums, nums_actual_size, atoi(argv[2]));
printf("[%d, %d]\n", indices[0], indices[1]);
free(indices);
free(nums);
return EXIT_SUCCESS;
}
typedef struct int_pair {
int value;
int index;
} int_pair_t;
int get_other_index(int_pair_t* pairs, int pairs_size, int value, int index) {
for (int i = 0; i < pairs_size; ++i) {
if (pairs[i].value == value && pairs[i].index != index) {
return pairs[i].index;
}
}
return -1;
}
void append_pair(int_pair_t* pairs, int* pairs_size, int value, int index) {
pairs[*pairs_size].value = value;
pairs[*pairs_size].index = index;
*pairs_size = *pairs_size + 1;
}
int* twosum(int* nums, int nums_size, int sum) {
int* indices = malloc(sizeof(int) * 2);
indices[0] = -1;
indices[1] = -1;
int_pair_t* pairs = malloc(sizeof(int_pair_t) * nums_size);
int pairs_size = 0;
for (int i = 0; i < nums_size; ++i) {
append_pair(pairs, &pairs_size, nums[i], i);
}
for (int i = 0; i < nums_size; ++i) {
int other_index = get_other_index(pairs, pairs_size, sum - nums[i], i);
if (other_index != -1) {
indices[0] = i;
indices[1] = other_index;
break;
}
}
free(pairs);
return indices;
}
При выполнении с помощью следующей команды:
./a.out 12,12,1,4,8,3,10 14
Я ожидаю
[3, 6]
, но иногда получаю
[-1, -1]
Я предполагаю, что эта ошибка связана суправление памятью (неправильно), но я изо всех сил пытаюсь найти его.Я был бы признателен, если бы кто-нибудь мог дать некоторое представление.