题目描述:
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 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()方法
这是一个关于字符串排序的问题,要求按照特定规则进行字符排列:英文字母不分大小写从A到Z排序,保持输入顺序,非字母字符不变。给出了样例及Java实现,涉及到冒泡排序、额外空间解决方案以及Character类的相关方法。
4396

被折叠的 条评论
为什么被折叠?



