輸入一組數,找出其中滿足某種條件的數(二)
阿新 • • 發佈:2018-09-28
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]; 10View Code} 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 }
因為這道題的前提是輸入的數均不超過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 }
輸入一組數,找出其中滿足某種條件的數(二)