描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
数据范围:字符串长度满足 1≤len(str)≤1000
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
示例1
输入:
aaddccdc
输出:
cda
说明:
样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.
解题思路:
我用了一个整型数组来统计数字和字母出现的次数,该整型数组的大小为36(10个数字,26个字母),其中下标为0~9的数组元素分别存储数字0~9出现的次数,而下标为10~35的数组元素分别存储字母a~z出现的次数。将所有字符都统计完毕之后,比较各个元素出现的频次,即整型数组元素的大小,根据数组下标即可联系到相应的字符,逐个打印即可;而且数组下标递增也和数字字符与字母字符的ASCII码递增吻合。
代码如下:
#include <stdio.h>
#define N 36
#define M 1000
int find_max(int arr[])
{
int i,max=0;
for(i=1;i<N;i++)
{
if(arr[max]<arr[i])
max=i;
}
if(arr[max]>0)
{
arr[max]=0;
return max;
}
else
return -1;
}
int main()
{
int arr[N]={0},i=0,max;
char str[M];
scanf("%s",str);
while(str[i]!='\0')
{
if(str[i]>='0'&&str[i]<='9')
arr[str[i]-'0']++;
else
arr[str[i]-'a'+10]++;
i++;
}
for(i=0;i<N;i++)
{
max=find_max(arr);
if(max>=0&&max<=9)
printf("%c",max+'0');
else if(max>=10&&max<=35)
printf("%c",max-10+'a');
}
return 0;
}