句子字符串排序

题目描述
编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y

样例:
输入:

A Famous Saying: Much Ado About Nothing(2012/8).

输出:

A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).

示例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

题目解析:就是排一下序号,不区分大小写,但是输出区分大小写,并且保持非字母的位置。只要写一个数组记录当前的字符和位置,最后再合并就可以了。具体实现看代码

代码:

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<vector>
#include<map>
#include<iomanip>
using namespace std; 

bool cmp(pair<char,int> p1,pair<char,int> p2){
	if(p1.first == p2.first || p1.first - 32 == p2.first || p1.first == p2.first - 32){
		return p1.second < p2.second;       //字母相同,比较序号 
	}else{                                  //当字母不同时,将字母全都转化为大写,再比较 
		if(p1.first >= 'a' && p1.first <= 'z'){
			p1.first = p1.first - 32;
		}
		if(p2.first >= 'a' && p2.first <= 'z'){
			p2.first = p2.first - 32;
		}
		return p1.first < p2.first;
	}
	
}
int main() {
	string sentence;
	vector<pair<char,int>> vc1,vc2;   //vc1记录字母,vc2记录非字母 
	while(getline(cin,sentence)){
		int len = sentence.size();
		for(int i = 0 ; i < len ; i++){
			if(int(sentence[i]) < 65 || (int(sentence[i]) > 91 && int(sentence[i]) < 97) || int(sentence[i]) > 123 ){
				vc2.push_back(make_pair(sentence[i],i));      //记录非字母和它的位置
			}else{
				vc1.push_back(make_pair(sentence[i],i));     //记录字母和他的位置 
			}
		}
		//将字母排序 
		sort(vc1.begin(),vc1.end(),cmp);
		//按位置插入非字母 
		for(int i = 0 ; i < vc2.size();i++){
			vc1.insert(vc1.begin()+vc2[i].second,vc2[i]);
		}
		//输出合并后 
		for(int i = 0 ; i < vc1.size();i++){
			cout << vc1[i].first;
		}
		cout << endl;
		vc1.clear();
		vc2.clear();
	} 
	return 0;
}
发布了41 篇原创文章 · 获赞 0 · 访问量 1178

猜你喜欢

转载自blog.csdn.net/Gedulding/article/details/104315378
今日推荐