簡體   English   中英

打印序列中出現次數最多的數字

[英]Print the number that appears the maximum number of times in the sequence

最近我遇到了這樣的問題

編寫一個程序來讀取一個由 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();
}

現在我認為這段代碼不是優化的……我想要一個時間和空間復雜度更小、解決方案更好的解決方案。

您不必第二次遍歷所有 N 個項目,只需遍歷 201 個計數以尋找最大的。

您的代碼看起來非常接近最優。 鑒於您的限制,它只能做得更好一點。

  1. 當您指的是 memset 時,請使用 memset。 是的,編譯器會在 99% 的情況下選擇它,但為什么要麻煩呢?

     for(i=0;i<201;i++) arr[i]=0; // becomes memset(arr, '\\0', sizeof(arr))
  2. 任何給定項目的計數不能超過 10000。這意味着它可以保存在 ushort 中!

     int arr[201]; // becomes uint16_t arr[201];
  3. 你的第二個循環應該從for(i = -100; i <= 100; i++) ,並且只是循環arr

  4. 你的代碼很丑。 使用一致的縮進、大括號樣式,並且不要在同一行中塞滿 50 個聲明。 元素之間可以有空格。 arr應該命名為有意義的東西,我喜歡counts 看起來您正在嘗試使用 gnu 樣式 C,但 K&R 也可以工作,實際上只需選擇任何樣式指南並瀏覽它即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM