查找数组中最常见的数字

时间:2018-04-25 12:23:04

标签: c arrays frequency

我正在尝试查看数组中出现的数字最多。我写了这段代码,但它没有输出正确的数字。有人能告诉我哪里出错了吗

我的逻辑:

  1. 通过数组查找与之相同的数字 本身。然后每次找到一个数字时,它会增加+1 与自身相同(loop_freq_amt)。
  2. 然后在完成数组之后,它会看到loop_freq_amt(它刚刚检查过的数字的频率)是否大于作为最频率的当前数字(freq_amt)。如果它更大,那么freq_num将被替换。
  3. 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 :(得分:1)

你忘记设置freq_amt,所以总是为0.每个数字看起来都比这更频繁,所以你会得到最后一个数字而不是最常用的数字..

    if(loop_freq_amt > freq_amt) {
        freq_num = loop_freq_num;
        freq_amt = loop_freq_amt; // Added
    }

答案 1 :(得分:1)

您的代码中有一些小错误。

  1. 您的数组中有“total_number”数字,因此您的循环需要从0到total_number - 1。
  2. 如果您有新的最高频率编号,则忘记更新freq_amt。
  3. 之后,一些编码风格的建议:在循环数组时,使用带有内部迭代器声明的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)));
    
    }
    

答案 2 :(得分:0)

您忘了更新freq_amt。

另一个解决方案是创建一个累加器(大小最大的数组),并在第一个循环中增加当前数字的累加器

在第二个循环中找到对应于更多频率数的累加器的值。