2018华为校招笔试题
校招题1 字符串重排
给定一个原始字符串,统计字符串中各字符出现的次数,并按照ASCII码递增的顺序依次输出。
例:原始字符串为eeefgghh
统计字符串中各字符的出现次数:
e : 3
f : 1
g : 2
h : 2
重排字符串输出为:efgheghe
说明:给定的原字符串只包含数字和字母,大写字母和小写字母存在区别。
样例输入输出:
eeefgghh
efgheghe
这道题其实在平时的C语言中就有过小模块的训练,一般分为字符串中字符的计数和字符串的重排。计数可以通过设置数组,数组的下标为字符的ASCII码,数组存储的数为对应字符的数量,特别要注意下标的查重。但是C++STL提供的关联容器map使得计数和排序变得格外简单。map的key值用于存放字符,value用于存放对应字符的数量。由于map本身的特性,字符已经默认按照ASCII码递增的方式存放了,接下来需要考虑如何重排字符串。我的想法是通过控制迭代器对value的指向是否大于0,来判断对应字符是否应该输出。由于map是键值匹配关系,设置迭代器it,其中it->first是key值,it->second是value值。当it->second>0时,输出it->first,it后移;否则直接it后移。而当输出一轮字符时,it需要回到起始位置,这时的判断条件应该是it==map.end() && n>0,这里的n指的是剩余字符串的长度。
大功告成,直接上代码:
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
int main(){
string str;
map<char,int> s;
getline(cin,str);
for(int i=0;i<str.length();i++){
s[str[i]]++;
}
int n=str.length();
for(map<char,int>::iterator it=s.begin();;){
if(it->second>0){
cout<<it->first;
it->second --;
it++;
n--;
}
else{
it++;
}
if(it==s.end() && n>0) it=s.begin();
if(n==0) break;
}
return 0;
}
输入输出显示:
如有更好方法,请各位大佬指正。
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_34563932/article/details/79905124
上一篇: 牛客练习赛25