题目描述
写一个算法统计在输入字符串中各个不同字符出现的频度并将结果输出(字符串中的合法字符为A-Z之间的26个字母和0-9之间的10个数字)。
输入
多组数据,每组数据有一行,为待统计字符频度的字符串。当字符串为“0”时,输入结束。
输出
对于每组数据输出n行,每一行为一个字符出现的频度(只输出存在的字符,格式为:字符:频度),字符排列顺序按照ASCII码从小到大的顺序
样例输入 Copy
LITTLE5ILOVEYOU AREYOUOKNUMB90077 0样例输出 Copy
5:1 E:2 I:2 L:3 O:2 T:2 U:1 V:1 Y:1 0:2 7:2 9:1 A:1 B:1 E:1 K:1 M:1 N:1 O:2 R:1 U:2 Y:1
思路分析:
首先利用两个桶,分别记录数字和字母出现的次数(桶的下标表示字母或数字,a[i]表示这个字母或者数字出现的次数),因为题目要求按ascll从小到大输出,所以先输出数字,再输出字母。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[26];//用来存字母
int b[10]; //用来存数字
int main()
{
while(1)
{
for(int i=0;i<26;i++)
{
a[i]=0;
}
for(int i=0;i<=9;i++)
{
b[i]=0;
}
string s;
cin>>s;
if(s[0]=='0')//需要带上引号才表示ascll码值
{
break;
}
for(int i=0; i<s.length(); i++)
{
if(s[i]>='A'&&s[i]<='Z')//字母 存入
{
a[s[i]-65]++;//应该是s[i]-65+1表示这个字母在单词表中的位置,但是桶的数组从零开始,所以再减去一
}
else
{
b[s[i]-48]++;
}
}
for(int i=0; i<=9; i++)
{
if(b[i]!=0)
{
cout<<i<<":"<<b[i]<<endl;//b[i]表示它出现的次数
}
}
for(int i=0; i<26; i++)
{
if(a[i]!=0)
{
cout<<char(i+65)<<":"<<a[i]<<endl;
}
}
}
return 0;
}
/*
啊,被题目吓到了,按ascll码从小到大,先输出数字再输出字母不就行了,数字跟数字都是挨着的
*/