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


    书接上文。

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

    短短的一句话,可以衍生出各种场景。今天遇到一道题,输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从大到小输出。分数均为不超过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 }
  • 相关阅读:
    SQL Server AUTO_FIX_Login_Users
    SQL Server Always On 切换主机Login和User无法匹配解决方案
    SQL Server 目标主体名称不正确,无法生成 SSPI 上下文
    SQL Server Rebuild Index
    jqery和js如何判断checkbox是否选中 (转)
    jxl
    jxl 管理excel
    Bootstrap库之Modals
    jquery attr()
    js 验证数字(验证字符串是否是数字)
  • 原文地址:https://www.cnblogs.com/ll-10/p/9720418.html
Copyright © 2020-2023  润新知