书接上文。
输入一组数,找出其中满足某种条件的数。
短短的一句话,可以衍生出各种场景。今天遇到一道题,输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从大到小输出。分数均为不超过100的非负整数。
我首先想到的是利用哈希表,用空间换时间。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
因为这道题的前提是输入的数均不超过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 }