小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出移位后的字符串。
示例1
输入
AkleBiCeilD
输出
kleieilABCD
思路:冒泡排序法,注意这里不是看起来的大写字母AB不能一起往后冒,真正理解了是从左到右每次都把一个大写字母冒到最后,第一次是D,第二次是C,第三次是B,最后一次是A。所以就用一个正向的冒泡排序就能求解。
#include <iostream>
using namespace std;
int main(){
string s;
while(cin>>s){
int len = s.length();
for(int j = len-2;j>=0;--j){
for(int i = 0;i<=j;++i){
if((s[i] >= 'A' && s[i] <= 'Z') && (s[i+1]>='a' && s[i+1]<='z')){
swap(s[i],s[i+1]);
}
}
}
cout<<s<<endl;
}
return 0;
}
联想发散:回顾三种基本排序,插入排序,选择排序和冒泡排序。
插入排序:首先把第一个数组元素当作有序数列,然后不断添加新的元素,与其比较,插入到其后面,插入操作需要先把其他后面的元素右移一位。
选择排序:每次选择最大或者最小的放在第一位或者最后即可。
冒泡排序:相邻元素之间比较,把较大或较小的往后冒。