1. 程式人生 > >輸入一組數,找出其中滿足某種條件的數(二)

輸入一組數,找出其中滿足某種條件的數(二)

new pan cout include str view 哈希 出現 ash

書接上文。

輸入一組數,找出其中滿足某種條件的數。

短短的一句話,可以衍生出各種場景。今天遇到一道題,輸入一些學生的分數,哪個分數出現的次數最多?如果有多個並列,從大到小輸出。分數均為不超過100的非負整數。

我首先想到的是利用哈希表,用空間換時間。

技術分享圖片
 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int hash[101] = { 0 };
 7     int n = 0;
 8     while (cin >>n) {
 9         ++hash[n];
10
} 11 12 int x = 0; 13 int pos = 0; 14 for (int i = 0; i < 101; i++) { 15 if (hash[i] > x) { 16 x = hash[i]; 17 pos = i; 18 } 19 } 20 cout << pos << endl; 21 system("pause"); 22 }
View Code

因為這道題的前提是輸入的數均不超過100,所以很容易知道需要定義的hash數組的大小。那如果輸入的數的大小不確定,怎麽做呢?

這時應該邊輸入邊記錄最大值,然後使用new動態生成數組。而且必須將輸入的數保存在一個數組中,這樣的話空間復雜度更大了。

具體實現:

 1 #include<iostream>
 2 using namespace std;
 3 const int maxSize = 50;
 4 int arr[maxSize];
 5 int main()
 6 {
 7     int i = 0;
 8     int max = -INT_MAX;
 9     while (cin>>arr[i])
10     {
11         if (max < arr[i])
12 max = arr[i]; 13 i++; 14 } 15 int *hash = new int[max + 1]; 16 for (int j = 0; j < max + 1; j++) { 17 hash[j] = 0; 18 } 19 for (int j = 0; j < i; j++) { 20 ++hash[arr[j]]; 21 } 22 int MAX = hash[0]; // MAX表示哈希數組中的最大值 23 int pos = 0; 24 for (int j = 0; j < max + 1;j++) { 25 if (hash[j] > MAX) { 26 MAX = hash[j]; 27 pos = j; 28 } 29 } 30 delete[] hash; 31 cout << pos << endl; 32 33 return 0; 34 }

這種實現真是太雞肋了。我查閱了一些網上的資料,發現還可以拿map做。

map是C++的一種容器,map<key,value>,具有一對一的數據處理能力。

具體實現如下:

 1 #include<iostream>
 2 #include<map>
 3 using namespace std;
 4 
 5 int Max_appearence(int arr[],int len)
 6 {
 7     map<int, int> m;
 8     int max_appearence = arr[0];
 9     for (int i = 0; i < len; i++) {
10         ++m[arr[i]];
11         if (m[arr[i]] > m[max_appearence])
12             max_appearence = arr[i];
13     }
14     return max_appearence;
15 }
16 
17 int main()
18 {
19     int arr[] = { 1,2,4,6,4,5,4 };
20     int len = sizeof(arr) / sizeof(*arr);
21     cout << Max_appearence(arr, len);
22     system("pause");
23     return 0;
24 }

輸入一組數,找出其中滿足某種條件的數(二)