一个数字出现多少次

时间:2017-07-06 00:53:26

标签: c

请帮帮我。我不明白为什么输出是“发生”是“30”,而不是“3”..这就好像我将答案乘以“10”,但我不是......也许答案我的问题是对我的代码,但有人可以解释为什么和如何?拜托..非常感谢你提前..

请查看我的代码。

#include <stdio.h>

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int occur[10] = {NULL};
    int max = 0;
    int most;

    for(int i = 0; i < 10; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            occur[arr[j]]++;
            if(occur[arr[j]] > max)
            {
                max = occur[arr[j]];
                most = arr[j];
            }
        }
    }

    printf("Most frequent: %d\ occurs: %d\n", most, max);

    return 0;
}

我在“最常见的”中得到了正确答案。但“发生”是30,而不仅仅是3,因为7次发生3次。

4 个答案:

答案 0 :(得分:2)

因为存在执行10次的外循环,所以变为30。 我猜你想要获得数组中最常用的数字以及发生了多少次这就是为什么你有一个外循环。如果您的数组中的数字大于9,这将导致出现数组中的索引超出范围问题,这将不起作用。您应该将实现更改为:

#include <stdio.h>

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int max = 0;
    int most;

    for(int i = 0; i < 10; i++)
    {
        int tmp = arr[i], count = 0;
        // if the current number is the current max number then skip
        if(tmp == max)
           continue;
        for(int j = 0; j < 10; j++)
        {
            // increment count if number in index j is equal to tmp number
            count += arr[j] == tmp ? 1 : 0;
        }
        // [this condition will depend on the requirement.]
        // replace max and most if the count of tmp number is greater than your 
        // current max
        if(count > max){
            max = count;
            most = tmp;
        }
    }
    printf("Most frequent: %d\ occurs: %d\n", most, max);

    return 0;
}

未经测试,如果有任何问题,请随时编辑。

答案 1 :(得分:1)

您将max乘以10,因为您完成了100次(而不是10次),因为您完全冗余for i循环。

具体来说,问题是你要将occurs中的值递增10次(而不是一次)。由于most不使用递增的值,因此没有问题。

答案 2 :(得分:0)

更快的O(2n-1)复杂性解决方案

#include <stdio.h>

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int occur[10] = {NULL};
    int max = 0;

    for(int i = 0; i < 10; ++i)
       ++occur[arr[i]];

    for (int i = 1; i < 10; ++i)
       if (occur[i] > occur[max])
         max = i;

    printf("Most frequent: %d\ occurs: %d\n", max, occur[max]);

    return 0;
}

然而更快,在O(n)......我有一种感觉......

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int occur[10] = {NULL};
    int max = 0;

    for(int i = 0; i < 10; ++i)
       if (++occur[arr[i]] > occur[max])
          max = arr[i];

    printf("Most frequent: %d\ occurs: %d\n", max, occur[max]);

    return 0;
}

答案 3 :(得分:-1)

我不会说你的O(n ^ 2)操作算法不是完成任务的理想方式。

但移动一行代码将修复您的代码。

你的循环:

  for(int i = 0; i < 10; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            occur[arr[j]]++;

修正:

  for(int i = 0; i < 10; i++)
  {
      occur[arr[i]]++;
      for(int j = 0; j < 10; j++)
      {

我将让你弄清楚如何在O(2n)操作中做到这一点或更少...