华为机试-字符串排序
题目描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 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).
输入描述:
输出描述:
示例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
问题分析:
该题保持顺序不变 其实就是利用稳定的排序方法,可以使用冒泡排序方法。交换条件需要仔细。
- import java.util.Scanner;
- /**
- * 题目描述 编写一个程序,将输入字符串中的字符按如下规则排序。
- */
- public class Main {
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- while (scanner.hasNext()) {
- String string = scanner.nextLine();
- char[] ch = string.toCharArray();
- exchangeString(ch);
- String string2 = "";
- for (int i = 0; i < ch.length; i++) {
- string2 += ch[i];
- }
- System.out.println(string2);
- }
- }
- private static void exchangeString(char[] cs) {
- int num = cs.length;
- int compare = 0;
- int j = num - 1;
- for (int i = 0; i < num; i++) {
- while (j > i) {
- if ((cs[j] >= 'a' && cs[j] <= 'z') || (cs[j] >= 'A' && cs[j] <= 'Z')) {
- compare = findNext(cs, j);// 找到下一个字母位置
- if (compare != -1) {
- int cha = cs[j] - cs[compare];
- if (ifNeedExchange(cs[j], cs[compare])) {
- char temp = cs[compare];
- cs[compare] = cs[j];
- cs[j] = temp;
- }
- } else {
- break;
- }
- j = compare;
- } else {
- j--;
- continue;
- }
- }
- j = num - 1;
- }
- }
- private static boolean ifNeedExchange(char c, char d) {
- if (c >= 'a') {
- c -= 32;
- }
- if (d >= 'a') {
- d -= 32;
- }
- return c < d;
- }
- private static int findNext(char[] cs, int j) {
- if (j <= 0) {
- return -1;
- }
- for (int i = j - 1; i >= 0; i--) {
- if ((cs[i] >= 'a' && cs[i] <= 'z') || (cs[i] >= 'A' && cs[i] <= 'Z')) {
- return i;
- }
- }
- return -1;
- }
- }
posted on 2017-07-21 16:40 WenjieWangFlyToWorld 阅读(276) 评论(0) 编辑 收藏 举报