HJ26 字符串排序

题目描述

编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。

如,输入: By?e 输出: Be?y
数据范围:输入的字符串长度满足 1 \le n \le 1000 \1n1000 

输入描述:

输入字符串

输出描述:

输出字符串

示例

输入:
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;
    }
}
复制代码

 

posted @   An2i  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示