题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
import java.util.*;
import java.util.stream.Stream;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String str = in.nextLine();
char[] chs = str.toCharArray();
// 相同的字母分组存储,排序完成后,再按输入的顺序组装起来
Map<String, List<Character>> iptChsMap = getIptSortChsMap(chs);
// 对输入的字符进行排序,使用冒泡法
sortWithIptStr(chs);
// 按输入的顺序还原相同的字符
recoverWithIptSort(chs, iptChsMap);
// 输出
StringBuilder sb = new StringBuilder();
Stream.of(chs).forEach(sb::append);
System.out.println(sb);
}
}
private static void recoverWithIptSort(char[] chs,
Map<String, List<Character>> iptChsMap) {
for (int i = 0; i < chs.length; i++) {
String lowerStr = String.valueOf(chs[i]).toLowerCase();
List<Character> sameList = iptChsMap.get(lowerStr);
if (sameList != null) {
// 每次都取一个,拼接完删除
char ch = sameList.remove(0);
chs[i] = ch;
}
}
}
private static void sortWithIptStr(char[] chs) {
char temp;
for (int i = 0; i < chs.length - 1; i++) {
for (int j = i; j < chs.length; j++) {
if (isLetterChar(chs[i]) && isLetterChar(chs[j])) {
char preChar = String.valueOf(chs[i]).toLowerCase().toCharArray()[0];
char nextChar = String.valueOf(chs[j]).toLowerCase().toCharArray()[0];
if (preChar > nextChar) {
temp = chs[i];
chs[i] = chs[j];
chs[j] = temp;
}
}
}
}
}
private static Map<String, List<Character>> getIptSortChsMap(char[] chs) {
Map<String, List<Character>> iptChsMap = new HashMap<>();
for (char ch : chs) {
String lowerStr = String.valueOf(ch).toLowerCase();
List<Character> sameList = iptChsMap.get(lowerStr);
if (sameList == null) {
sameList = new ArrayList<>();
iptChsMap.put(lowerStr, sameList);
}
sameList.add(ch);
}
return iptChsMap;
}
private static boolean isLetterChar(char ch) {
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
return true;
}
return false;
}
}
美团成长空间 2663人发布