179. Largest Number

195 篇文章 0 订阅

####问题描述
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.

题目链接:

####思路分析
给一数组,将它合成一个最大的数,以string形式返回。

关键在于要将首位最大的数放在前面,这就需要自己设计一个sort的comparator,sort的条件是对比两个string相加的值,将大的放在前面,这就是一个冒泡排序,只不过STL给我们简化了。

然后将结果res string的前面不合理的0都去掉就可以了。

We want to compare the digit of each numbers and sort with bigger digit in the left to front. So we could convert each number to string first, then compare each number’s string value and sort bigger string to front. After sort, use a string builder to contain the final result.

remember to solve a corner case like all zero value in nums array.
####代码

class Solution {
    public String largestNumber(int[] nums) {
        if (nums.length == 0){
            return "0";
        }
        String[] strs = new String[nums.length];
        for (int i = 0; i < nums.length; i++){
            strs[i] = String.valueOf(nums[i]);
        }
        Comparator<String> cmp = new Comparator<String>(){
            @Override
            public int compare(String str1, String str2){
                String s1 = str1 + str2;
                String s2 = str2 + str1;
                return s2.compareTo(s1);
            }
        };
        Arrays.sort(strs, cmp);
        //corner case if nums only has a bunch of zero.
        if (strs[0].charAt(0) == '0'){
            return "0";
        }
        StringBuilder sb = new StringBuilder();
        for (String str : strs){
            sb.append(str);
        }
        return sb.toString();
    }
}
class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> str;
        for (auto i : nums)
            str.push_back(to_string(i));
        sort(str.begin(), str.end(), [](string& s1, string& s2){ return s1 + s2 > s2 + s1;});
        string res = "";
        for (auto s : str)
            res += s;
        while (res[0] == '0' && res.length() > 1)
            res.erase(0, 1);
        return res;
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)


####反思
关键在于sort的comparator的设计,在函数内部inline重载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值