牛客大整数排序

链接:
原题
来源:牛客网

题目

对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());
            }
        }
    }
}
发布了57 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/104707564