DreamJu-1255-字符串排序2

1.题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

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

规则 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).

输入输出格式

输入描述:

输出描述:

输入输出样例

输入样例#:

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

输出样例#:

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

题目来源
北京大学机试题

2.题解

2.1 字符串重组 + Lambda表达式

思路

这里尝试了一下Lambda表达式的使用 和 copy_if 这个函数的使用
copy_if(xx_old.begin(), xx_old.end(), back_inserter(xx_new), 函数对象/Lambda表达式(表示复制条件));
这里为何不再想copy函数一样提供一个xx_new.begin()就可以了呢?因为这里有复制条件,就导致了新数组的长度不定,不像copy中长度固定,直接resize即可
所以这里创建一个可以将元素插入到容器末尾的迭代器back_inserter,可以动态扩容!

这里刚开始希望在一个compare函数内解决,然后发现保留非字母符号原来位置比较困难,所以选择将字母提取出来单独处理
再利用下标关系,修改数组input为output,重建字符串

代码

#include<bits/stdc++.h>
using namespace std;
bool compare(char a, char b){
	// 如果是英文字母,不区分大小写,按照 A 到 Z 排序
    if (isalpha(a) && isalpha(b)) {
    	return tolower(a) < tolower(b);
    } 
    return false; 
}

int main(){
	string input;
	getline(cin, input);
	vector<char> letters;
	// 第三个参数指的是 创建一个可以将元素插入到容器末尾的迭代器
	copy_if(input.begin(), input.end(), back_inserter(letters), [](char c){
		return isalpha(c);
	});
//	stable_sort(letters.begin(), letters.end(), compare); 
	
	// 所有字母进行排序 
	stable_sort(letters.begin(), letters.end(), [](char a, char b){
    	return tolower(a) < tolower(b);
	}); 
	
	// 重组字符串 
	int cnt = 0;
	string output;
	for(char ch : input){
		if(isalpha(ch)){
			output.push_back(letters[cnt++]);
		}else{
			output.push_back(ch);
		}
	}
	cout << output;
	return 0;
} 
posted @ 2024-06-15 00:02  DawnTraveler  阅读(5)  评论(0编辑  收藏  举报