描述
写一个算法统计在输入字符串中各个不同字符出现的频度并将结果输出(字符串中的合法字符为A-Z之间的26个字母和0-9之间的10个数字)。
输入
多组数据,每组数据有一行,为待统计字符频度的字符串。当字符串为“0”时,输入结束。
输出
对于每组数据输出n行,每一行为一个字符出现的频度(只输出存在的字符,格式为:字符:频度),字符排列顺序按照ASCII码从小到大的顺序。
输入样例 1
LITTLE5ILOVEYOU
AREYOUOKNUMB90077
0
输出样例 1
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
思路:
首先用string类型输入,这个题的测试点在于字符串里有空格,所以要用getline(cin,s)而不是cin>>.
因为要按顺序输出大写字母和数字,那么必然涉及到一个排序,而string类型是不好排序的,所以转成char[]类型,具体的转换可以参考这篇文章:C++中如何将string类型转化成char类型_LintaoD的博客-CSDN博客_将string转化为charhttps://blog.csdn.net/LintaoD/article/details/77893349
转换完后利用自己写的降序cmp函数对string中的每一个字符进行排序,排完后再次赋值给string(char[]转string可以直接转换)。
之后的Show()函数中,对排好序的字符进行再次赋值,只有符合输出条件的字符才被赋给temp(就是一会要真正输出的那个string)
如果temp是空,说明没有符合要求的字符,退出;
否则,让char c=temp[0],遍历temp,设置计数器cnt,和当前不一样就输出,一样就cnt++
最后一个字符不存在与之比较的下一个字符,所以要单独输出~
代码如下:
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
int cmp(char a, char b)
{//字符排列顺序按照ASCII码从小到大的顺序。
return a < b;
}
void Show(string s)
{
int cnt = 1;
char c;
string temp = "";
for (int i = 0; i < s.length(); i++)
{//当前字符为大写字母或数字
if (isalnum(s[i]) && s[i] < 97)
temp = temp + s[i];
}
c = temp[0];
if (c == '\0')
{
cout << 0 << endl;
return;
}
for (int i = 1; i < temp.length(); i++)
{
if (temp[i] == c)
cnt++;
else
{
printf("%c:%d\n", c, cnt);
c = temp[i];
cnt = 1;
}
}
printf("%c:%d\n", c, cnt);//最后一个字符是不会与别的比较的,记得单独输出它
}
int main()
{
string s;
while (getline(cin,s)&&s!="0")//getline输入可以带空格,如果不考虑带空格字符串的输入就会WA
{
char c[1000];
s.copy(c, s.length(), 0);//这里s.length()代表复制几个字符,0代表复制的位置,
*(c + s.length()) = '\0';//注意手动加结束符!!!
sort(c, c + s.length(), cmp);
s = c;
Show(s);
strcpy(c, "");//vs 2019要写成strcpy_s,但是oj上记得把_s去了
}
return 0;
}