题解 | #字符串排序#
字符串排序
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; } }