题目复制于牛客网

题目描述

先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。

输入描述:

输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。

输出描述:

输出m行,格式参见样例,按从小到大排。

输入

1
7
3 2 3 8 8 2 3
1 2 3 2 1 3 1

输出

1={2=0,3=2,8=1}
2={2=1,3=0,8=1}
3={2=1,3=1,8=0}

解法:

第一次做写了七八十行,死活调不出来,于是转去刷pat-basic和leetcode,一个月之后想起来再重新做了一遍,二十分钟不到就搞定了...

总共代码不到40行... 强 力扣 强

哈希表存储分组和元素的映射关系,关系为

map<int,vector<int>> mp;

每一个分组对应一个由其对应元素组成的数组

 

使用集合存储所有的元素种类

unordered_set<int> datatype;

不需要排序,因此可以使用unordered_set来节省时间

存储好后按序输出即可

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void show(vector<int> v,unordered_set<int> datatype){
 4     map<int,int> mm;
 5     for(auto it : datatype) 
 6         mm[it] = 0;
 7     for(int i = 0;i < v.size();i++) 
 8         mm[v[i]]++;
 9     for(auto it = mm.begin();it != mm.end();it++){
10         if(it != mm.begin()) 
11             cout << ",";
12         cout << it->first << "=" << it->second;
13     }
14 }
15 int main(){
16     int n,m;
17     cin >> n;
18     while(n--){
19         cin >> m;
20         unordered_set<int> datatype;
21         int data[m],group;
22         for(int i = 0;i < m;i++) {
23             cin >> data[i];
24             datatype.insert(data[i]);
25         }
26         map<int,vector<int>> mp;
27         for(int i = 0;i < m;i++){
28             cin >> group;
29             mp[group].push_back(data[i]);
30         }
31         for(auto it = mp.begin();it != mp.end();it++){
32             cout << it->first << "={";
33             show(it->second,datatype);
34             cout << "}" << endl;
35         }
36     }
37     return 0;
38 }        

 

posted on 2020-03-31 19:18  Touko_me  阅读(152)  评论(0)    收藏  举报