描述

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。


如,输入: By?e 输出: Be?y

数据范围:输入的字符串长度满足1n1000 

输入描述:

输入字符串

输出描述:

输出字符串

示例1

输入:
A Famous Saying: Much Ado About Nothing (2012/8).
输出:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
先看看别人的代码:
#include<stdio.h>
#include<string.h>

int main() {
    char str[1001] = {0};
    int index = 0;
    scanf("%[^\n]",str);
    int len = strlen(str);
    char str_ch[len];
    for (char j = 'A'; j <= 'Z'; j++) {//不分大小写遍历字母表的26个字母
        for (int i = 0; i < len; i++) {//i为str的下标
            if ( (str[i] == j)||(str[i] - 32 == j) ){//str当前元素必须是大/小写字母
                str_ch[index++] = str[i];//记录
            }
        }
    }
    //printf("%s\n",str_ch);
    index = 0;
    for (int i = 0; i < len; i++) {
        if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) {
            str[i] = str_ch[index++];//str中是大小写字母就写入
        }
        printf("%c", str[i]);//输出字符数组
    }
    return 0;
}
别人代码的算法思路大致是这样:

再来看看我自己修改的代码:
#include <stdio.h>
#include <string.h>
//以下是Senky的代码:
void start() {
    char str[1001];//存原始字符串
    scanf("%[^\n]", str);
    int n = strlen(str); //原始字符串长度
    char str_ch[n];//辅助字符串(变量做数组大小不可初始化)
    int index=0;//辅助数组的下标
    for (char i = 'A'; i <= 'Z';i++) {//不分大小写遍历字母表的26个字母
        for (int j = 0; j < n; j++) {//j为str的下标
            if (str[j] == i ||str[j] - 32 == i) { //str当前元素必须是大/小写字母
                str_ch[index++]=str[j];//大小写字母全部存入辅助数组
            }
        }
    }

    index=0;
    //str中存字母就输出str_ch,str中存其他字符就输出str
    for(int i=0;i <n; i++){
        if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){
            printf("%c",str_ch[index++]);
        }else{
            printf("%c",str[i]);
        }
    }
}

int main() {
    start();
    return 0;//编辑于2022/10/13
}
我的代码算法思路:

附上用例1的辅助字符数组:

总结
①果然代码是需要写的,写了才能会,别人的看会了,再用我的算法自己写,写出来的代码就是我的了
当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;