输入一组数,找出其中满足某种条件的数(二)

书接上文。

输入一组数,找出其中满足某种条件的数。

短短的一句话,可以衍生出各种场景。今天遇到一道题,输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从大到小输出。分数均为不超过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 }

猜你喜欢

转载自www.cnblogs.com/ll-10/p/9720418.html