题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
import java.util.*;
// 因为涉及不区分大小写排序,所以稳定的冒泡排序任然会出现大小写交换的情况,所以使用选择排序的变种,对每次交换数据都要将需要交换的两列之间的字符向后移动以保证相对顺序不变
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String line = in.nextLine(); // 2 13 2
char[] array = line.toCharArray();
for (int i = 0; i < array.length; i++) {
int idx = i;// 每次选择最小的数据
if (array[i] >= 'A' && array[i] <= 'Z' || array[i] >= 'a' && array[i] <= 'z') { // 跳过非字母
for (int j = i + 1; j < array.length; j++) {
if (array[j] >= 'A' && array[j] <= 'Z' || array[j] >= 'a' && array[j] <= 'z') {
int ai = array[idx] > 'Z' ? array[idx] - 32 : array[idx];
int aj = array[j] > 'Z' ? array[j] - 32 : array[j];
if (ai > aj) {
idx = j;
}
}
}
}
if (idx != i) { // 数据交换
char tmp = array[i];
array[i] = array[idx];
for (int k = idx - 1; k > i; k--) {
if (array[k] >= 'A' && array[k] <= 'Z' || array[k] >= 'a' && array[k] <= 'z') {// 跳过非字母
array[idx] = array[k];// idx不断变成前面一个字母的位置
idx = k;
}
}
array[idx] = tmp;
}
}
System.out.println(String.valueOf(array));
}
}
}
查看6道真题和解析