题解 | 华为HJ26#字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 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的辅助字符数组:
总结:
①果然代码是需要写的,写了才能会,别人的看会了,再用我的算法自己写,写出来的代码就是我的了;
②当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;
华为-HJ 文章被收录于专栏
机试的题解
阿里云工作强度 667人发布