我有一個陣列,比如 1,3,3,1,2 代碼的輸出必須是 4(1 的 2 次重復 3=4 的 2 次重復)。我怎樣才能在 C 中做到這一點?這是我的嘗試。
#include <stdio.h>
int main(){
int n,i,j,temp;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i ){
scanf("%d",&arr[i]);
}
for(i=0;i<n;i ){
int min = i;
for(j=i 1;j<n;j ){
if(arr[j]<arr[min]) min=j;
}
temp= arr[min];
arr[min]=arr[i];
arr[i]=temp;
}
int count=1;
for(i=0;i<n;i ){
if(arr[i]==arr[i 1])count ;
else continue;
}
printf("%d",count);
}
uj5u.com熱心網友回復:
看起來你的回圈有幾個問題。
- 它索引超出陣列的末尾,這是未定義的行為
- 它不知道何時計算一組重復項中的第一項
關于#1,最好從 1 而不是 0 開始回圈,然后i-1對照i.
關于#2,您的代碼有效,但僅當只有一個數字有重復時。這是因為您從 1 開始計數。但是,當您遇到另一個組時,該假設就會失效。最簡單的方法是只記錄您是否要開始一個新組。
讓我們把這一切放在一起:
int count = 0;
int first = 1;
for(i = 1; i < n; i ) {
if (arr[i-1] == arr[i]) {
count = first 1;
first = 0;
} else {
first = 1;
}
}
至于排序步驟,它使用了一種效率極低的演算法。這對于小型資料集來說很好,但是如果您有大量輸入,您就會遇到問題。使用類似的東西是明智的qsort。有很多例子可以說明如何做到這一點。
所以,你現在的運行時間是 O(N^2)。使用快速排序,它變成 O(N.logN)。
您可能可以使用諸如哈希表之類的東西進一步減少運行時間,該哈希表僅存盤您找到的每個值的數量,并在它們到達時進行更新。
如果您的資料范圍定義明確且足夠小,您可能還受益于使用大陣列而不是哈希表,并為每個可能的數字存盤一個位,表示何時看到一個數字。實際上,對于您的情況,由于“組中的第一個”問題,您需要其中兩個。現在,每個到達的數字都會設定“seen”位。如果已經看到,設定“重復”位并增加計數。如果未設定“重復”位,則增加計數。現在你幾乎可以保證超快的 O(N) 運行時間,其中測驗和計算重復值是 O(1)。
uj5u.com熱心網友回復:
您需要更改此 for 回圈。
int count=1;
for(i=0;i<n;i ){
if(arr[i]==arr[i 1])count ;
else continue;
}
例如,它可以通過以下方式查看
int count = 0;
for ( i = 0; i < n; )
{
int j = i;
while ( i < n && arr[i-1] == arr[i] );
if ( !( i - j < 2 ) ) count = i - j;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/439565.html
