以下為第(2)種方法的程式碼,另附測試檔 a.txt b.txt c.txt
a共110個數字{有5個5} 、 b共10000個數字{有6個100}、 c共10000個數字{有8個98765432}
/*
p2a 02/05 練習:若有 N 個數 A[0],A[1],.....A[N-1],求重複最多的個數
例 有10個數 1,2,3,4,5,2,3,4,5,2,最多為3個 {註:2有3個}
本題(1) 若A[0]~A[N-1]的範圍不大<10^6的話{假設為M},可用空間換取時間,直接宣告C[M]來計數即可,
(2) 但若範圍太大{0~10^9 },而N不太大<10^4的話,可將A陣列排序後,以下列程式碼來計算最多個數
(3) 也可以使用類似 b05的解法
*/
#include <iostream>
#include <algorithm> // 使用 sort 需用
using namespace std;
int main()
{
int i,n, a[10000];
cin >> n ;
for(i=0; i<n; ++i) cin >> a[i]; // 讀入 a 陣列
sort(a,a+n); // 將 a 陣列由小至大排序
// 計算連續相同的數字
int ans = 1;
for(i=1;i<n-1;++i)
{
if( a[i] == a[i-ans] ) ++ ans;
// 當ans為1 若a[i]與前a[i-1]相同,則 ans+1就是長度為2
// 當ans為2 若a[i]與前a[i-2]相同,則 ans+1就是長度為3
// 當ans為 k 若a[i]與前a[i-k]相同,則 ans+1就是長度為 K+1
// 若沒有比 k 長的相同數字, ans 不會再加
}
cout << "最多相同數共 " << ans << "個\n";
return 0;
}
/*
範例輸入
10
1 2 3 4 5 2 3 4 5 2
範例輸出
3
*/
0 意見:
張貼留言