链接:
原题
来源:牛客网
题目
对N个长度最长可达到1000的数进行排序。
输入描述:
输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。
输出描述:
可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。
示例1
输入
3
11111111111111111111111111111
2222222222222222222222222222222222
33333333
输出
33333333
11111111111111111111111111111
2222222222222222222222222222222222
分析
第一眼看到这个题就想到了一个偷懒的方法-------我们可以利用TreeMap插入元素的时候会对元素进行排序这个特性。
我们创建一个BigNumber自定义类然后实现Comparable接口。接下来的事我想大家就明白了。覆写compareTo方法。
返回值 | 表示 |
---|---|
1 | 指定的数大于参数 |
-1 | 指定的数小于参数 |
0 | 指定的数等于参数 |
我们知道TreeMap插入数据(自定义类)的时候会调用我们覆写的compareTo方法,然后根据返回的整数对数据进行排序。因为默认排序是从小到大。我们就按上面的表格进行写就可以了。
假如我们需要倒序也就是从大到小排。我们可以故意写反返回值。小于的时候返回1,这样TreeMap就会被我们骗了,将小的按大的排。结果就导致倒序排列。
下面是比较方法:
public int compareTo(BigNumber number){
//1.先按长度比较
if(s.length() < number.s.length()){
return -1;
}else if(s.length() > number.s.length()){
return 1;
}else{
//长度相同,接下来我们得好好比较了
//思虑:从头开始遍历字符串,模拟字符串的比较规则,我们再偷懒直接调用字符串的方法
return s.compareTo(number.s);
}
}
代码
import java.util.TreeMap;
import java.util.Set;
import java.util.Scanner;
//思路:实现Comparable接口自定义一个比较方法,然后利用TreeMap加入自动排序,最后我们获取出Map的keys即可
class BigNumber implements Comparable<BigNumber>{
private String s;
public BigNumber(String s){
this.s = s;
}
public int compareTo(BigNumber number){
//1.先按长度比较
if(s.length() < number.s.length()){
return -1;
}else if(s.length() > number.s.length()){
return 1;
}else{
//长度相同,接下来我们得好好比较了
//思虑:从头开始遍历字符串,模拟字符串的比较规则
return s.compareTo(number.s);
}
}
public String getS(){
return s;
}
}
public class Main{
public static void main(String[] args){
//输入流
Scanner in = new Scanner(System.in);
while(in.hasNextLine()) {
String n = in.nextLine(); //行数,为了避免nextInt()和nextLine()全按字符串处理
//我们定义一个Map
TreeMap<BigNumber, String> map = new TreeMap<BigNumber, String>();
int len = Integer.parseInt(n);
//输入数字
for (int i = 0; i < len; i++) {
String s = in.nextLine();
map.put(new BigNumber(s), null);
}
//添加完毕,获取map集合的keys并输出
Set<BigNumber> keys = map.keySet();
for (BigNumber key : keys) {
System.out.println(key.getS());
}
}
}
}