【华为OD机试】1022 - 字符串排序
2023-09-14 09:05:30 时间
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
💖系列专栏:华为OD机试(Java&Python&C语言)
一、题目
🔸题目描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
🔸输入输出
输入
输入字符串
输出
输出字符串
🔸样例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
二、代码参考
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNextLine()){
String str = input.nextLine();
str = sort(str);
System.out.println(str);
}
}
public static String sort(String str) {
List<Character> characters = new ArrayList<>();
for (char ch : str.toCharArray()){
if (Character.isLetter(ch)) {
characters.add(ch);
}
}
//将英文字母先排序好
characters.sort(Comparator.comparingInt(Character::toLowerCase));
//若是非英文字母则直接添加
StringBuilder result = new StringBuilder();
for (int i = 0, j = 0; i < str.length(); i++) {
if (Character.isLetter(str.charAt(i))) {
result.append(characters.get(j++));
}
else {
result.append(str.charAt(i));
}
}
return result.toString();
}
}
--------------------------------------------------------
while True:
try:
letter = input()
letter_list = sorted([i for i in letter if i.isalpha()],key=lambda x:x.lower())
print(*(letter_list.pop(0) if v.isalpha() else v for i,v in enumerate(letter)),sep='')
except:
break
--------------------------------------------------------------
#include <stdio.h>
void swap(char *, char *);
void bubbleSortSpecial(char *, int);
//1:将字符串中的所有英文(大小写)字符,复制到新的字符串中;
//2:对新字符串,进行稳定的冒泡排序,需要考虑到,不能够改变大小写字符的而相对位置;
// 第一的想到的,就是稳定排序算法;
//3:将排好序的字符串,重新赋值到原字符串的对应位置。
int main(){
char str[1001] = {0};
while(scanf("%[^\n]", str) != EOF){
getchar();//清空输入缓冲区
//将字符串中的英文字符进行提取
char chStr[1001] = {0};
int i = 0, j = 0;
for(; str[i] != '\0'; i++){
if((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')){
chStr[j++] = str[i];
}
}
//针对chStr字符串,进行特殊的冒泡排序
bubbleSortSpecial(chStr, j);
//大小写字符串排序好后,顺序输出到原字符串中的字符位置,满足规则3
for(i = 0, j = 0; str[i] != '\0'; i++){
if((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')){
str[i] = chStr[j++];
}
}
//输出字符串,字符串中的大小写英文字母,已经按照所有规则进行了排序
printf("%s\n", str);
}
return 0;
}
void swap(char *a, char *b){
char temp = *a;
*a = *b;
*b = temp;
return;
}
void bubbleSortSpecial(char *str, int size){
int flag, i, j;
char A, B;//分别用来记录str[j]与str[j+1]对应的“小写字母”,用以作为排序的依据
for(i = 0; i < size - 1; i++){
flag = 0;
for(j = 0; j <= size - 2 - i; j++){
//由于在排序时,需要暂时忽略掉大小写,因此需要借助辅助变量,来进行字符“大小的比较”;
//首先将str[i]与str[j + 1]替换为对应的小写字符(或者大写也行,统一即可)
//注:A和B的使用,使得排序不区分大小写,也通过A>B条件判断,使排序稳定,
// 也即使得规则1与规则2被满足。
A = str[j] < 97 ? (str[j] + 32) : str[j];
B = str[j + 1] < 97 ? (str[j + 1] + 32) : str[j + 1];
if(A > B){
swap(&str[j], &str[j + 1]);
flag = 1;
}
}
if(!flag){
break;
}
}
return;
}
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
相关文章
- 新成立「机器视觉军团」,华为安防背水一战
- 华为奔赴“空间智能”,全屋智能的逻辑变了吗?
- 改写电子产品价值曲线,华为智慧屏树起一面旗帜
- 华为P40 Pro用户分享鸿蒙系统体验以为误入iOS
- 【虎嗅早报】华为:免去苏箐智能驾驶产品部部长职务;安徽一教师在别墅补课被现场查处
- 消息称华为 P50/Pro 手机发布会将官宣全国老款手机内存扩容
- 谁愿为4G版华为新旗舰买单?
- 华为FreeBuds 4蜜语红今日上市:半开放主动降噪2.0
- 历史首次!华为P50 Pro屏幕霸榜全球第一:超过三星顶级屏
- 前Oculus技术大神加盟华为,Snapchat收购AR公司 | 沉浸感周刊
- 华为Watch迎来Android Wear 2.0更新
- 华为:Mate 40/Pro 系列鸿蒙 HarmonyOS 2.0.0.165 版需适配优化,下周开始逐步推送
- 华为徐直军签发《关于规范 HarmonyOS 沟通口径的通知》