任务描述
写一个算法统计在输入字符串中各个不同字符出现的频度,并将结果输出(字符串中的合法字符为A-Z之间的26个字母和0-9之间的10个数字)。
编程要求
输入
多组数据,每组数据有一行,为待统计字符频度的字符串。当字符串为“0”时,输入结束。
输出
对于每组数据输出n行,每一行为一个字符出现的频度(只输出存在的字符,格式为:字符:频度),字符排列顺序按照ASCII码从小到大的顺序。
测试说明
平台会对你编写的代码进行测试:
测试输入: LITTLE5ILOVEYOU
AREYOUOKNUMB90077
0
预期输出: 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
1.个人最初的想法是对string c排序,删掉相同的(后续字符每个前移一位)并把出现次数给相应b[],但觉得没有按照ascII码的大小存储后,接着输出方便,便没有采用
2.虽然按照ascII码的大小存储后,接着输出很方便,但因此把main中的int[36]改为int[100],并且打印时因为b[]中存了值的位置是因string c的字符的ascII码而定,不仅分布散乱而且不知道长度,只能遍历整个数组。感觉是不太好文章来源:https://www.toymoban.com/news/detail-788910.html
PS:string是c++的类型,并有c.length()方法表示字符串长度。也可理解为字符数组长度,string c的c应该和char c[10]的c一样都是指针,所以都可以用c[9]表示文章来源地址https://www.toymoban.com/news/detail-788910.html
#include<iostream>
#include<cstring>
using namespace std;
void Count(string c,int b[])
{//统计字符出现的频度
/**************begin************/
for(int i=0;c[i]!='\0';i++){//给对应字符的int[]赋值
b[c[i]-'/']++;//因为main()中b[]默认0,'0'-'0'=0会出问题
}
//题目要求按ascII码顺序打印,通过按照ascII码顺序存值的b[]输出最合适
for(int i=0;i<=100;i++){
if(b[i]==0) continue;
printf("%c:%d\n",i+'/',b[i]);//b[]中不会输出重复同一个字符,因为同一字符-'/'的值一样
/**************end************/
}
}
int main()
{
string c; //存储输入的字符串
while(cin>>c)//键入string c
{
if(c=="0") break;
int *b=new int[100]{0}; //存储对应字符的个数
Count(c,b);
}
return 0;
}
到了这里,关于数据结构:串:第3关:统计字符出现的频度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!