最近我遇到了像这样的问题
编写一个程序来读取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();
}
现在我觉得这个代码没有经过优化...我希望有一个解决方案,它可以减少时间和空间的复杂性,提供更好的解决方案。
答案 0 :(得分:2)
您不必再次遍历所有N个项目,只需遍历201个计数,寻找最大的项目。
答案 1 :(得分:0)
您的代码看起来非常接近最佳状态。考虑到你的约束,它可以做得更好。
当你的意思是memset时使用memset。是的,编译器会在99%的时间内选择它,但为什么要这么麻烦?
for(i=0;i<201;i++) arr[i]=0; // becomes
memset(arr, '\0', sizeof(arr))
任何给定项目的计数不能大于10000.这意味着它可以保存在用户中!
int arr[201]; // becomes
uint16_t arr[201];
您的第二个循环应该来自for(i = -100; i <= 100; i++)
,而只是循环遍历arr
。
你的代码很丑陋。在同一行使用一致的缩进,大括号样式和不要声明50个声明。元素之间的空间是可以的。 arr
应该被命名为有意义的东西,我喜欢counts
。看起来你似乎正在尝试使用gnu风格C,但K&amp; R也是如此,只需挑选任何风格指南并浏览它。