打印出现在序列中的最大次数的数字

时间:2014-04-04 02:23:54

标签: c performance

最近我遇到了像这样的问题

编写一个程序来读取N个整数的序列并打印出那个数字 出现序列中的最大次数。 约束 1 <= N <= 10000 整数将在[-100,100]

范围内

我写了以下代码:

main()
{int arr[201],max=0,maxelement,n,i,num;
int t;
scanf("%d",&n);
int *storenum=(int *)malloc(sizeof(int)*n);
 for(i=0;i<201;i++)
 {
             arr[i]=0;
 }
 for(i=0;i<n;i++)
{
             scanf("%d",&num);
             storenum[i]=num;
             if(num<=100 && num>=-100)
             {
                         arr[num+100]=arr[num+100]+1;

             }
 }
 for(i=0;i<n;i++)
 {
             int t=storenum[i]+100;


         if(arr[t]>max)
        { maxelement=storenum[i];
         max=arr[t];}

 }

    printf("\n\n%d",maxelement);     

getch();
}

现在我觉得这个代码没有经过优化...我希望有一个解决方案,它可以减少时间和空间的复杂性,提供更好的解决方案。

2 个答案:

答案 0 :(得分:2)

您不必再次遍历所有N个项目,只需遍历201个计数,寻找最大的项目。

答案 1 :(得分:0)

您的代码看起来非常接近最佳状态。考虑到你的约束,它可以做得更好。

  1. 当你的意思是memset时使用memset。是的,编译器会在99%的时间内选择它,但为什么要这么麻烦?

    for(i=0;i<201;i++) arr[i]=0; // becomes
    memset(arr, '\0', sizeof(arr))
    
  2. 任何给定项目的计数不能大于10000.这意味着它可以保存在用户中!

    int arr[201]; // becomes
    uint16_t arr[201];
    
  3. 您的第二个循环应该来自for(i = -100; i <= 100; i++),而只是循环遍历arr

  4. 你的代码很丑陋。在同一行使用一致的缩进,大括号样式和不要声明50个声明。元素之间的空间是可以的。 arr应该被命名为有意义的东西,我喜欢counts。看起来你似乎正在尝试使用gnu风格C,但K&amp; R也是如此,只需挑选任何风格指南并浏览它。