2014-04-04 64 views
2

最近我通過這樣的打印顯示的序列

問題消失在最大次數的數量寫一個程序來讀取N個整數序列,並打印數量 出現的最大數量次序。 CONSTRAINTS = N < = 10000 的整數將在範圍[-100,100]

我已經writen以下代碼:

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(); 
} 

現在我認爲這個代碼沒有優化的一個。 ..我想有一個解決方案,將有更少的時間和空間的複雜性和更好的解決方案。

+3

這裏有問題嗎?此外,這應該屬於代碼審查 –

+0

不要忘記配置文件,之前和之後。 – Mikhail

回答

0

你的代碼看起來非常接近最優。考慮到你的限制,它可以做得更好一點。

  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。它看起來像你試圖使用牛羚風格C,但K & R的作品也是,真的只是選擇任何風格指南,並通過它瀏覽。

+0

爲什麼在所有情況下使用memset:'int arr [201] = {0};' – AShelly

+0

@ashelly放下我的草坪!但是,如果可用,該版本會更好。坦率地說,我不確定作者正在使用什麼版本的C語言。 – U2EF1

+0

我相信自從K&R開始工作以來, p219:「如果列表中的初始化器數量少於結構體的成員,則尾隨成員將初始化爲0.」 – AShelly

2

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

+0

+1這不僅是正確的,它是接近最優的可能有10,000個數字,並測試每個數字,if(x!= most && freq [x]> freq [most])most = x;',(first expr消除對重複數字的兩個解除引用)最多10,000次將比計數循環之後的固定201槽陣列上的單遍更昂貴,基本上執行初始選擇分類而不交換。 – WhozCraig