题面描述
春天到了,校园里开满了郁金香。 Infinity 经过花坛的时候,常常会停下来数郁金香玩。
Infinity 会分别统计不同颜色的花出现的次数,并把它们按照出现次数从多到少排序。
这次 Infinity 来到了一个很大的花坛前,和往常一样继续数郁金香。
不料,他数到一半时突然忘记数到哪了。 Infinity 不想从头开始数了,你能帮帮他吗?
输入数据
第一行有一个整数 t (1 ≤ t ≤ 100) ,表示有 t 组数据。
对于每组数据:
第一行有两个整数 n, m (1 ≤ n, m ≤ 100) ,表示花坛的长和宽;
接下来 n 行,每行有一个长度为 m 且由大写字母组成的的字符串,表示对应位置出现的花的种类。其中,相同的字母表示相同的花,不同的字母表示不同的花。
输出数据
对于每组数据:
第一行输出一个整数 k ,表示花坛中一共有 k 种不同的花。
接下来 k 行,每行输出一个整数 x 和一个字符 c ,表示出现了 x 个种类为 c 的花。
你需要按花出现的次数从大到小的顺序输出,如果多种花数量相同,请按花的种类从小到大输出。
样例输入
1
3 3
ABC
BBC
CCC
样例输出
3
5 C
3 B
1 A
解题思路(菜鸟)
以二维数组的方式存放花坛的花(字母),统计出现的种类及数量,经过排序(要求:数量多在前,相同时ASIIC小在前)输出。
解题过程
中间出现了全局变量未清零的情况,导致未能AC。经过大神的指导,找到了问题所在,并且优化了代码结构。最终AC之后,代码的运行速度从0.048到0.028。
--1 全局变量清零代码
int Count[26] ;// 26个字母数量统计
char Str[26] ;// 存放26个字母
void Reset()// 全局变量清零
{
for (int i = 0 ; i < 26 ; i++)
{
Count[i] = 0 ;
Str[i] = 0 ;
}
}
--2 优化代码
我的
void Flower(char F)// 识别花坛的花,并存放
{
char FF[26] =
{
'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' ,
'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' ,
'O' , 'P' , 'Q' , 'R' , 'S' , 'T' ,
'U' , 'V' , 'W' , 'X' , 'Y' , 'Z'
};
for (int i = 0 ; i < 26 ; i++)
if (F == FF[i])
{
Str[i] = FF[i] ;
Count[i] = Count[i] + 1 ;
}
}
大神的
void Flower(char F)
{
Str[F-'A'] = F ;
Count[F-'A']++ ;
}