http://career-oj.huawei.com/exam/ShowProblemInfo?id=2168
编写一个程序,将输入字符串中的字符按如下规则排序。
规则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).
解答:
其实就是一个从小到大的排序。
规则2的意思就是这个排序算法必须是一个稳定的算法,冒泡可以,选择就不是稳定的了。这点必须得看出来!
规则3基本上可以忽略,只要在冒泡排序的时候判断两个都是字母且tolower(ch)前大后小才交换即可,这样就不要管那些非字母了。
总结:
开始做之前考虑好是否有更好的方法。我的做法是把原来字符串中所有字母提取出来(非字母保持不动),放到了一个新开辟的数组里面,然后对它们进行排序,最后再把排好序的填回到那些非字母保持不动的字符串中。这里空间效率就很低了。我的低效代码:
#include <iostream> #include <string> #include <cctype> using namespace std; void mySort(char* pArr, int n); //#define DEBUG int main(void) { string str; getline(cin, str); int len = str.length(); int noChCnt = 0; //非英文字母数 char* pArr = new char[len + 1]; for (int i = 0; i <= len; i++) //结果集置为空 pArr[i] = '