欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2018华为校招笔试题

程序员文章站 2022-04-02 18:22:50
...

校招题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;
	
} 

输入输出显示:

2018华为校招笔试题



如有更好方法,请各位大佬指正。



版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_34563932/article/details/79905124





相关标签: 算法