描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
数据范围:字符串长度满足?1 \le len(str) \le 1000 \1≤len(str)≤1000?
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
示例1
输入:
aaddccdc
复制输出:
cda
复制说明:
样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.
#include <string.h>
#include <vector>
#include <bits/stdc++.h>
//aaddccdc
void charCount(std::string str)
{
std::map<char, int> charmap;
for(int i = 0; i < str.length(); ++i)
{
char c = str[i];
std::size_t size = charmap.count(c);
std::map<char, int>::iterator iter = charmap.find(c);
if(0 == size) //说明字符c不存在,则加入
{
charmap.insert(std::pair<char,int>(c, 1));
}
else //存在则在原先的基础上加1
{
charmap.erase(c);
charmap.insert(std::pair<char,int>(c, iter->second + 1));
}
}
// print(charmap);
std::multimap<int, char> revertMap;
std::map<char, int>::iterator charMapIter = charmap.begin();
while (charMapIter != charmap.end())
{
revertMap.insert(std::pair<int,char>(charMapIter->second, charMapIter->first));
charMapIter++;
}
// print(revertMap);
std::reverse_iterator<std::multimap<int, char>::iterator> iter = revertMap.rbegin();
while (iter != revertMap.rend())
{
int key = iter->first;
// std::cout << "key = " << key << std::endl;
size_t size = revertMap.count(key);
if(size == 1)
{
std::cout << iter->second;
iter++;
}
else
{
std::multimap<int, char>::iterator tempiter = revertMap.find(key);
while (size--)
{
std::cout << tempiter->second;
tempiter++;
iter++;
}
}
}
std::cout << std::endl;
}
int main()
{
std::string str;
getline(std::cin, str);
charCount(str);
return 0;
}
|