HJ26 字符串排序
题目描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000
输入描述:
输入字符串
输出描述:
输出字符串
示例
输入: A Famous Saying: Much Ado About Nothing (2012/8). 输出: A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
解题思路:
规则一:英文字母从 A 到 Z 排列,不区分大小写。
规则二:同一个英文字母的大小写同时存在时,按照输入顺序排列。
规则三:非英文字母的符号保持位置不变。
这题不难,但是坑点在于使用冒泡等排序算法可能无法满足规则二。所以需要先取出字母满足规则二的情况下进行排序,这里通过按字母大小进行枚举,判断是否出现该大小写字母,若存在则按序进队列(或容器vector)。
之后将队列或容器中有序的字母按序填回字符串原本存放字母的位置。
代码如下:
#include <iostream> #include <string> #include <vector> using namespace std; char lower(char a) { if (a >= 'a' && a <= 'z') return a; return a + 32; } int main() { string str; while (getline(cin, str)) { int n = str.length(); vector<char> vec; for(int i=0;i<26;i++){ for(int j=0;j<n;j++){ if((str[j]-'a' == i) || (str[j]-'A' == i)) vec.push_back(str[j]); } } for(int i=0,k=0;(i<n)&&(k<vec.size());i++){ if((str[i] >= 'a' && str[i] <= 'z' ) || (str[i] >= 'A' && str[i] <= 'Z' )){ str[i] = vec[k++]; } } cout << str << endl; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理