今天看到一道題,是關于整數數組的去重和排序。 碰到去重也沒有多想,就直接遍歷數組然后判斷,如果重復,則把后面的數字前移 代碼如下:
for(i=0;i<N;i++) for(j=i+1;j<N;j++) if(a[i]==a[j]) { for(k=j;k<N-1;k++) a[k]=a[k+1]; N--; }乍一看好像還很有道理很簡潔有沒有,但是如果我輸入10個數: 3 3 3 3 1 1 1 1 1 1 并經過排序后, 結果卻為: 1 1 3 3 為什么呢? 1、 i=0 1) j =1時 數組變為 3 3 3 1 1 1 1 1 1 2) j=2時 數組變為3 3 1 1 1 1 1 3) j=3時 a[i]!=a[j] 2、 i=1 a[i]!=a[j] 發現問題了嗎?對于這種情況,這種方法無法實現完全去重。
另外,我在其他人寫的代碼中還發現了另一種錯誤方法: 遍歷數組,如果重復,則令:a[j]=a[N-1]; N–;
for(i=0;i<N;i++) for(j=i+1;j<N;j++) if(a[i]==a[j]) { a[j]=a[N-1]; N--; }乍一看也很簡單是不是? 然而運行時也出現了問題: 輸入10個數:3 3 3 3 1 1 1 1 1 1 并排序后, 結果為: 1 1 3 為什么呢? 對3成功去重后,數組為 3 1 1 1 1 1 1 1、 i=1 1) j =2時 數組變為 3 1 1 1 1 1 2) j=3時 數組變為3 1 1 1 1 3) j=4時 數組變為3 1 1 1 2、 i=2 3) j=3時 數組變為3 1 1 可見,這種方法也無法實現完全去重。
特此標記,以免再犯。
|
新聞熱點
疑難解答