《算法笔记》4.2小节——算法初步->哈希->问题 B: 分组统计
题目描述:
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入
输入第一行表示样例数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}
代码C++
// 错误一般出现在hashTable的初始化范围,题目只说明了有n个数,且n的范围(n<=100),但每个数的范围未说明。
#include<cstdio>
int main() {int m;scanf("%d", &m);while (m--) {int n;int a[110] = { 0 }, hashTable[2000][2000] = { 0 };scanf("%d", &n);int max = 0;// first rowfor (int i = 0; i < n; i++) {scanf("%d", &a[i]);if (a[i] > max) {max = a[i];}hashTable[0][a[i]] = 1;}// second rowint max_group = 0;for (int j = 0; j < n; j++) {int k;scanf("%d", &k);hashTable[k][a[j]]++;if (k > max_group) {max_group = k;}hashTable[k][0] = 1;}// outputfor (int i = 0; i <= max_group; i++) {if (hashTable[i][0]) {printf("%d={", i);for (int j = 0; j <= max; j++) {if (hashTable[0][j]) {printf("%d=%d", j, hashTable[i][j]);if (j != max) {printf(",");}}}printf("}\\n");}}}return 0;
}