2018华为校招笔试题

校招笔试题 专栏收录该内容
1 篇文章 0 订阅

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





  • 1
    点赞
  • 5
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值