题解 | #字符串排序#
字符串排序
http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
- 由于非字母的位置不能动。字母需要排序,因此考虑将两者分开存放
- 由于字母排序时,大小写要保留原顺序,因此考虑先入先出的队列
- 遍历非字母,为空时,从字母中取值。从a到z
import java.util.*;
/**
* class com.sloera.nowcoder
* user sloera
* date 2022/2/22
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String a = in.nextLine();
sort(a);
System.out.print("\n");
}
}
/**
* 排序逻辑
*
* @param s
* @return void
* @date 2022/2/22
*/
private static void sort(String s) {
final char[] chars = s.toCharArray();
// final char[] alphabet = new char[s.length()];
final char[] special = new char[s.length()];
final ArrayList<Queue<Character>> alphabet = new ArrayList<>(26);
for (int i = 0; i < 26; i++) {
Queue<Character> characters = new ArrayDeque<>();
alphabet.add(characters);
}
// 区分存放字母或非字母
for (int i = 0; i < chars.length; i++) {
final int number = getNumber(chars[i]);
if (number != -1) {
alphabet.get(number).add(chars[i]);
} else {
special[i] = chars[i];
}
}
for (int i = 0; i < special.length; i++) {
if (special[i] != 0) {
System.out.print(special[i]);
continue;
}
for (int j = 0; j < alphabet.size(); j++) {
final Character poll = alphabet.get(j).poll();
if (poll != null) {
System.out.print(poll);
break;
}
}
}
}
/**
* 返回大小写无关的大小
*
* @param aChar
* @return int
* @date 2022/2/22
*/
private static int getNumber(char aChar) {
if (aChar >= 'A' && aChar <= 'Z') {
return aChar - 'A';
}
if (aChar >= 'a' && aChar <= 'z') {
return aChar - 'a';
}
return -1;
}
}