题解 | #字符串排序#
字符串排序
http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
使用冒泡排序算法,不需要使用集合工具类,一开始用的是选择排序,但选择排序想不到怎么解决相同字母按照顺序排列的规则,所以改用冒泡排序。 里面有个小细节 ,就是isOk方法中注释中提到的。其他代码相信很好理解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
String str = sc.nextLine();
String[] strings = str.split("");
for (int i = 0; i < strings.length-1; i++) {
for (int k = 0; k < strings.length-1-i;k++){
if((strings[k].toCharArray()[0]>='A' && strings[k].toCharArray()[0]<='Z')
|| (strings[k].toCharArray()[0]>='a' && strings[k].toCharArray()[0]<='z')){
int count = isOk(k,strings);
if (count != -1) {
if (strings[k].compareToIgnoreCase(strings[k + count]) > 0) {
String temp = strings[k + count];
strings[k + count] = strings[k];
strings[k] = temp;
}
}
}
}
}
for (String s : strings) {
System.out.print(s);
}
System.out.println();
}
}
private static int isOk(int k,String[] strings){
int count = 1;
/*如果索引为k的下一个字符是其他字符,则count++ 寻找k+1的下一位,直到找到字母字符为止
比如:A Famous Saying...中,A的下一位是空格,则跳过这一位,去和F比较 这样就可以形成常规的冒泡排序*/
while (!((strings[k+count].toCharArray()[0]>='A' && strings[k+count].toCharArray()[0]<='Z')
|| (strings[k+count].toCharArray()[0]>='a' && strings[k+count].toCharArray()[0]<='z'))){
count++;
//如果字符数组后全是非字母字符,则break循环,并将count改为-1 形成异常提示。调用方可以通过count值判断是否将排序算法终止
if(k+count >= strings.length){
count = -1;
break;
}
}
return count;
}
}