描述
对于给定的由大小写字母混合构成的 n 个单词,输出按字典序从小到大排序后的结果。
从字符串的第一个字符开始逐个比较,直到找到第一个不同的位置,通过比较这个位置字符对应的 Ascii 码( A<⋯<Z<a<⋯<z )得出字符串的大小,称为字典序比较。
从字符串的第一个字符开始逐个比较,直到找到第一个不同的位置,通过比较这个位置字符对应的 Ascii 码( A<⋯<Z<a<⋯<z )得出字符串的大小,称为字典序比较。
输入描述:
第一行输入一个整数 n(1≦n≦1000) 代表给定的单词个数。
此后 n 行,每行输入一个长度 1≦length(s)≦100 ,由大小写字母混合构成的字符串 s ,代表一个单词。
此后 n 行,每行输入一个长度 1≦length(s)≦100 ,由大小写字母混合构成的字符串 s ,代表一个单词。
输出描述:
输出 n 行,每行输出一个字符串,代表排序后的结果。第一行输出字典序最小的单词。
解法一(java):
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
List<String> list = new ArrayList<>();
int a = in.nextInt();
while (in.hasNext()) { // 注意 while 处理多个 case
String str = in.next();
list.add(str);
}
int size = list.size();
for (int i = 0 ; i < size; i++) {
for (int j = 0 ; j < size - i -1 ; j++) {
String tmp1 = list.get(j);
String tmp2 = list.get(j+1);
if (exchange(tmp1,tmp2)) {
list.set(j,tmp2);
list.set(j+1,tmp1);
}
}
}
for (String s : list) {
System.out.println(s);
}
}
public static boolean exchange(String one,String two) {
int oneLen = one.length();
int twoLen = two.length();
int len = oneLen > twoLen ? twoLen : oneLen;
for (int i = 0; i < len; i++) {
int c1 = one.charAt(i);
int c2 = two.charAt(i);
if (c1 > c2) {
return true;
} else if (c2 > c1) {
return false;
}
}
return oneLen > twoLen;
}
}
思路:先将数据放到一个集合中,然后冒泡排序,交换字符串的值,但是要注意交换的方法,容易出错。
解法二(java)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine(); // 消耗换行符
List<String> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(in.nextLine());
}
Collections.sort(list); // 默认字典序升序
for (String s : list) {
System.out.println(s);
}
}
}
-
优先用
Collections.sort()
,避免手写冒泡排序。 -
字典序规则:
String.compareTo()
已内置实现,直接调用即可。