描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
数据范围:输入的字符串长度满足1≤n≤1000
输入描述:
输入字符串
输出描述:
输出字符串
示例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的辅助字符数组:
总结:
①果然代码是需要写的,写了才能会,别人的看会了,再用我的算法自己写,写出来的代码就是我的了;
②当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;