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
#include
#include
using namespace std;

int main(){
	string str;
	map s;
	getline(cin,str);
	for(int i=0;i::iterator it=s.begin();;){
		if(it->second>0){
			cout<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






你可能感兴趣的:(校招笔试题)