题目描述:
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 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).
Java实现:
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String str = sc.nextLine(); char[] arr = str.toCharArray(); //冒泡排序,具有稳定性,不断将较大的字符放到后面,非字母的字符不动 /* for (int k = arr.length-1; k >= 0; k--) { int i = 0; for (int j = 0; j <= k; j++) { if (Character.isLetter(arr[j])) { if (Character.toLowerCase(arr[i]) > Character.toLowerCase(arr[j])) { swap(arr, i, j); } i = j; } } } System.out.println(String.valueOf(arr)); */ //挨个判断26个字母,对于从a到z的每个字母,遍历一遍字符串,不断按序添加到sb中 StringBuffer sb = new StringBuffer(); for (int i = 0; i < 26; i++) { char c = (char) (i+'A'); for (int j = 0; j < arr.length; j++) { if (arr[j] == c || arr[j] == (char)(c+32) ) sb.append(arr[j]); } } for (int i = 0; i < arr.length; i++) { if (!Character.isLetter(arr[i])) sb.insert(i, arr[i]); } System.out.println(sb.toString()); } } private static void swap(char[] arr, int i, int j) { char t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }
知识点:
- 冒泡排序时间复杂度为O(n^2),第二种虽然需要额外的空间,但时间复杂度为O(n)
- StringBuilder里的assert()方法可以把一个字符插入到任意位置
- Character类里的toLowerCase()方法和isLetter()方法