题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
1.先把字母找出并存起来,创建一个二维数据,将26个字母(忽略大小写,此处全用小写)的ASCII值映射到二维数组的行下标,数组对应的列用来存放相同字母对应的原始字母(分大小写)。
2.按顺序遍历数组获得排好序的字母序列。
3.利用原始字符串的字母位置特征,把里面的字母替换成可识别且不与其它字符冲突的字符,然后遍历原始数据,将排好序的字母序列更新进去。
最近有点魔怔了,凡事都优先想到了二维数组和数组下标法,囧~
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
// System.out.println(str);
String strabc = str.replaceAll("[^a-zA-Z]","");
// System.out.println(strabc);
String[][] strarr = new String[128][str.length()];
char[] ch = strabc.toCharArray();//将原始字母序列存起来
char[] chLowerCase = strabc.toLowerCase().toCharArray();//全部改成小写,用于将相同大小写字母(如:Aa)映射到相同的数组行
int minindex = 0;
int maxindex = 0;
for(int i = 0; i < strabc.length(); i++){
int rowindex = new Character(chLowerCase[i]).charValue();
for(int j = 0; j < strabc.length(); j++){
if(null == strarr[rowindex][j]){
strarr[rowindex][j] = Character.toString(ch[i]);
break;
}
}
minindex = Math.min(rowindex,minindex);
maxindex = Math.max(rowindex,maxindex);
}
//输出排好序的字母序列
String strtemp = "";
for(int m = minindex; m <= maxindex; m++){
for(int n = 0; n < strabc.length(); n++){
if(null != strarr[m][n]){
strtemp = strtemp + strarr[m][n];
}
}
}
// System.out.println("strtemp: "+strtemp);
//将原始字符串里面的字母替换成可以识别且不冲突的字符,用来标记哪些位置是需要替换新内容的
String strcharacter = str.replaceAll("[a-zA-Z]","A");
char[] chfinal = strcharacter.toCharArray();
char[] chtemp = strtemp.toCharArray();
int num = 0;
for(int index = 0; index < strcharacter.length(); index++){
if(chfinal[index] == 'A'){
chfinal[index] = chtemp[num];
num++;
}
}
System.out.println(chfinal);
}
}
查看9道真题和解析