Нахождение наиболее частого числа в массиве - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь увидеть, какое число встречается чаще всего в массиве. Я написал этот код, но он не выводит правильные числа. Может ли кто-нибудь сказать мне, где я иду не так

Моя логика:

  1. Он проходит через массив, чтобы найти числа, которые совпадают с сам. Затем он добавляет +1 к каждому разу, когда он находит число, которое является то же самое для себя (loop_freq_amt).
  2. Затем, после того, как он заканчивает массив, он видит, больше ли loop_freq_amt (частота номера, которую он только что проверил), чем текущее число, которое является самой частотой (freq_amt). Если оно больше, то freq_num заменяется.

int frequency_number (int array[]) {
int freq_num = 0;

int i = 0;
int j = 0;
while(i < ARRAY_SIZE) {
    if (array[i] == array[j]) {
        freq_calcualtor = (freq_number);
    }

return freq_num;
}

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Вы забыли установить freq_amt, поэтому оно всегда равно 0. Каждое число кажется более частым, поэтому вместо последнего вы получите последнее число.

    if(loop_freq_amt > freq_amt) {
        freq_num = loop_freq_num;
        freq_amt = loop_freq_amt; // Added
    }
0 голосов
/ 25 апреля 2018

В вашем коде есть небольшая ошибка.

  1. В вашем массиве есть число "total_number", поэтому вашему циклу нужно перейти от 0 до total_number - 1.
  2. Вы забыли обновить freq_amt, когда у вас есть новое число максимальных частот.

После, несколько советов по стилю кодирования: при циклическом выполнении массива используйте цикл for с внутренним объявлением итератора.Переменная loop_fre_num бесполезна.

int most_freq(int num_array[], size_t total_numbers)
{
    int freq_num = 0;
    int freq_amt = 0;

    for (size_t i = 0; i < total_numbers; ++i) {
        int loop_freq_amt = 0;

        for (size_t j = 0; j < total_numbers; ++j) {
            if (num_array[i] == num_array[j]) {
                ++loop_freq_amt;
            }
        }

        if(loop_freq_amt > freq_amt) {
            freq_num = num_array[i];
            freq_amt = loop_freq_amt;
        }
    }
    return freq_num;
}

По поводу «скопировать, отсортировать и найти самую длинную последовательность», вот реализация:

int qsort_comp_int(const void *elem1, const void *elem2)
{
    return (*(int *)(elem1) - *(int *)(elem2));
}


int most_freq(int num_array[], size_t total_numbers)
{
    int    *copy            = NULL;
    size_t copyByteSize     = sizeof(*copy) * total_numbers;
    int    freq_num         = num_array[0];
    int    freq_max_amt     = 0;
    int    freq_current_amt = 0;

    copy = malloc(copyByteSize);

    memcpy(copy, num_array, copyByteSize);

    qsort(copy, total_numbers, sizeof(*copy), qsort_comp_int);


    for (size_t i = 0; i < total_numbers; ++i) {
        if (i != 0 && copy[i] != copy[i - 1]) {
            if (freq_max_amt < freq_current_amt) {
                freq_num = copy[i - 1];
                freq_max_amt = freq_current_amt;
            }
            freq_current_amt = 0;
        } else {
            ++freq_current_amt;
        }
    }

    free(copy);
    return (freq_num);
}

int main (void)
{
    int array[] = {1, 2, 3, 4, 1, 1, 1, 0, 4, 10, 3};

    printf("'%d'\n", most_freq(array, sizeof(array)/sizeof(*array)));

}
0 голосов
/ 25 апреля 2018

Вы забыли обновить freq_amt.

Другое решение состоит в том, чтобы создать аккумулятор (массив с размером максимального числа), и в первом цикле вы увеличиваете аккумулятор текущего числа

И во втором цикле найдите значение аккумулятора, соответствующее более частому числу.

...