DreamJu-1255-字串排序2

DawnTraveler發表於2024-06-15

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;
} 

相關文章