参考连接:https://blog.csdn.net/qq_34563932/article/details/79905124
描述:将输入的字符串出现的次数统计并打印,最后重新输出,输出格式参考样例
样例:
输入:aabbcddd
输出:
a:2
b:2
c:1
d:3
abcdabdd
统计字符串次数:
主要使用SL的map会很快实现,具体参考https://blog.csdn.net/Li_haiyu/article/details/88782182
上面参考的第三种方法是最快的,但是我不是太理解,所以还是使用比较好理解的第二种方法统计字符串出现的次数吧
最后输出格式:
最后输出将重复的字符分别顺序输出,然后重复该过程。思路是在在map_s中存放了字符串出现的次数,所以使用迭代器遍历输出即可,每一次输出将次数减少一次,最后出现次数减少到0的就不再输出,循环借结束条件为输入的字符串长度递减到0.
参考代码:
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main() {
string str;
while (cin >> str) {
map<char, int> map_s;
for (int i = 0; i < str.length(); ++i) {
map<char, int>::iterator iter = map_s.find(str[i]);
if (iter == map_s.end()) {//说明没找到,没找到就存进去
map_s.insert(pair<char, int>(str[i], 1));
}
else//找到了,个数+1
iter->second++;
}
//输出统计结果
for (map<char, int>::iterator iter = map_s.begin(); iter != map_s.end(); iter++) {
cout << iter->first << ':' << iter->second << endl;
}
//重新输出
map<char, int>::iterator iter = map_s.begin();
int str_length = str.length();
while (str_length > 0) {
if (iter->second > 0) {
cout << iter->first;
iter->second--;
str_length--;
iter++;
}
else
iter++;
if (str_length > 0 && iter == map_s.end())
iter = map_s.begin();
}
cout << endl;
}
}
测试结果: