考研机试 76.字符串排序
时间:2021/03/09
一.题目描述
编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
样例:
输入:
A Famous Saying: Much Ado About Nothing(2012/8).
输出:
A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).
示例输入
A Famous Saying: Much Ado About Nothing (2012/8).
示例输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
题目链接
https://www.nowcoder.com/practice/d9aa3894d3aa4887843a85d26daa4437?
tpId=40&tqId=21407&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey
二.算法
题解
读入输入的一行字符串后转化为字符数组,然后将该行字符串中的所有字母放入到辅助数组temp中。定义一个符合题目规则的字符比较方法,然后根据题目的要求对temp数组进行排序。遍历原字符数组,当遇到字母时输出temp数组相应下标的字符,当遇到非字母时输出字符数组中相应位置的非字母。注意:这里使用的排序算法必须是稳定的排序算法,比如冒泡排序。
重点
冒泡排序是一种稳定的排序算法,使用时要注意一次排序确定的是最大值还是最小值,因为这会影响到两个循环的起始和结束位置。
代码
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ //读取输入 char[] ch = (in.nextLine()).toCharArray(); //将字母都存放到temp数组中 int len = ch.length; char[] temp = new char[len]; int index = 0; for(int i = 0; i < len; i++){ if((ch[i] >= 'a' && ch[i] <= 'z') || (ch[i] >= 'A' && ch[i] <='Z')){ temp[index++] = ch[i]; } } //根据题目给出规则对temp数组进行排序 boolean flag = false; for(int i = 0; i < index - 1; i++){ for(int j = 0; j < index - 1 - i; j++){ if(compare(temp[j], temp[j + 1])){ char c = temp[j]; temp[j] = temp[j + 1]; temp[j + 1] = c; flag = true; } } if(!flag){ break; } } //按照规则进行输出 int pos = 0; for(int i = 0; i < len; i++){ if((ch[i] >= 'a' && ch[i] <= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z')){ System.out.print(temp[pos++]); }else{ System.out.print(ch[i]); } } System.out.println(); } in.close(); } //对给出的两个字符按照规则比较大小 public static boolean compare(char a, char b){ if(a >= 'A' && a <= 'Z'){ a = (char)(a + 'a' - 'A'); } if(b >= 'A' && b <= 'Z'){ b = (char)(b + 'a' - 'A'); } return a > b; } }
努力,向上,自律