题目复制于牛客网
题目描述
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入描述:
输入第一行表示样例数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 }