179. Largest Number

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.

题意:给定一个int数组,要求将数组中的数拼凑成一个最大的数,并以字符串的形式输出。如上例。

这个题事实上可以转化成一个排序的问题,那么需要怎么排序才能达到要求呢?下面我们分析一下:

首先,我们先举个例子,如上述给定的例子[3, 30, 34, 5, 9]   ,我们自然知道第一位数为9才能拼凑成最大的数,接下来第二个数为5,但是第3个数就有点难以确认,因为剩下的3个数都是以3开头的分别是3,30和34,这个时候我们就需要通过组合来判断谁排在前面。

我们先分析3和30,如果我们将30排在前面,那么最大的数将是30****,如果我们将3排在前面,那么最大的数将是3****,并且此时最小为330***,显然大于前面的数,因此在3和30的比较过程中,3应该排在30的前面,换一种更加普遍的解释就是:a和b排序,如果ab>ba,那么a排在b前面,反之则b排在a前面。方法

经过这样一个排序的过程之后,我们只要将数组元素从头到尾拼凑成字符串即可;

下面是代码:

public class Solution {
    public String largestNumber(int[] nums) {
        String[] s = new String[nums.length];
        int j = 0;
        for(int i : nums){                         //将int数组转化为String数组便于排序
            s[j++] = String.valueOf(i);
        }
        
        Arrays.sort(s,new Comparator<String>(){                   //对String数组排序
            public int compare(String s1, String s2){
                String ss1 = s1+s2;
                String ss2 = s2+s1;
                return ss2.compareTo(ss1);
            }
        });
        
        if(s[0].charAt(0) == '0')                      //排除特殊情况
                    return "0";
        
        StringBuilder sb = new StringBuilder();            //将String数组转化成String
        for(String ss : s){
            sb.append(ss);
        }
        return sb.toString();
    }
}
这种解法在的时间复杂度为O(nlgn)(因为Arrays.sort()方法排序所需的时间复杂度),是一种不错的解法,最重要的是要想到这样一种排序的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值