标签:
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] = ‘\0‘; //先把非字符串填充到结果pArr中 for (int i = 0; i < len; i++) { if ((str[i] >= 65 && str[i] <= 90) || (str[i] >= 97 && str[i] <= 122)) { continue; } else { pArr[i] = str[i]; noChCnt++; } } //提取出待排序字符 char* pSortArr = new char[len - noChCnt]; int ii = 0; for (int j = 0; j < len; j++) { if (‘\0‘ == pArr[j]) pSortArr[ii++] = str[j]; } #ifdef DEBUG cout << pSortArr << endl; #endif //下面排序 mySort(pSortArr, len - noChCnt); #ifdef DEBUG cout << pSortArr << endl; #endif //填结果 ii = 0; for (int j = 0; j < len; j++) { if (‘\0‘ == pArr[j]) pArr[j] = pSortArr[ii++]; } cout << pArr; delete[] pSortArr; delete[] pArr; #ifdef DEBUG while (true) cin.get(); #endif return 0; } //注意:这个排序算法必须是稳定的,要不然不满足规则2 void mySort(char* pArr, int n) { //冒泡排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (tolower(pArr[j + 1]) < tolower(pArr[j])) { char ch = pArr[j + 1]; pArr[j + 1] = pArr[j]; pArr[j] = ch; } } } }
标签:
原文地址:http://www.cnblogs.com/jiayith/p/4345442.html