Leetcode 179(Java)

题目如下:Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

首先要确定原来对于数组的排序方式这道题肯定是行不通的,那么新的排序方式应该是这样:排序时应当先比较最高位,若最高位相同,则比较下一位,值得注意的是,在前几位数字都相同的情况下,谁的尾巴短,谁排在前面。例如330和33:高两位数字都相同,但33是个二位数,那么它就比330要有优势了。而真正落到代码的实现,其实只需要比较33033和33330谁大就可以了,AC代码如下:

public class Solution {
    public String largestNumber(int[] nums) {
        String num[] = new String[nums.length];
        if(nums==null||nums.length==0){
            return "";
        }
        for(int i=0;i<nums.length;i++){
            num[i] = String.valueOf(nums[i]);
        }

        Comparator<String> compr = new Comparator<String>(){
            public int compare(String m,String n){
                String s1 = m+n;
                String s2 = n+m;

                return s2.compareTo(s1);
            }
        };

        Arrays.sort(num,compr);

        if(num[0].charAt(0)=='0'){
            return "0";
        }
        StringBuilder rs = new StringBuilder();
        for(String x:num){
            rs.append(x);
        }

        return rs.toString();
    }
}

BTW,写代码的时候脑子卡在了compare后结果的升序降序问题上了,通过查找资料明白了,在这里写出来给和我一样原本不太理解的人一个参考。首先要明确的是:Arrays.sort(T[] a, Comparator<> c)这个方法是默认升序排列的。也就是说当我们compare(x,y)>1在说明x>y的同时也意味着sort后y将排在x的前面。对于这道题我们可以带入两个数值x=11,y=20。此时s1=1120,s2=2011,注意我们的返回值是s2.compareTo(s1)即返回1,那么根据我们的规则11是“大于”20的,再根据默认的升序规则,20将排在11的后面。就这样把升序巧妙的转换为了降序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值