排序相关系列题目精选~

十大基础排序算法可学习链接

leetcode179. 最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例如下:
输入:nums = [3,30,34,5,9]
输出:“9534330”

思路分析

转换成排序问题
算法步骤

  • 将nums中的各数字转化成字符串格式,保存在int2str中,
  • 应用以上自定义排序规则,对int2str中字符串执行排序
  • 拼接int2str中的所有字符串

NOTE
我们还需要考虑一种特殊的情况:前导0 例如:输入[0,0],输出因该为 “0” 而不是“00”。

因为字符串数组是自定义降序,我们可以检查排好序的字符串数组的第一个元素是否为0:

  • 如果第一个元素为0,说明后续若还有元素,也只能是0了,结果必然是0。
  • 如果第一个元素不为0,则不会出现前导0的特殊情况。
class Solution {
public:
    string largestNumber(vector<int>& nums) {
        string ans = "";
        vector<string> int2str;
        //原int数组转为字符串数组
        for(auto x : nums){
            int2str.push_back(to_string(x));
        }
        sort(int2str.begin(), int2str.end(), [](const auto& x, const auto& y){return x+y > y+x;});//按降序排列
        if(int2str[0] == "0")
            return "0";//若开头是0,后面全是0
        //排好序直接拼接即可
        for(const auto& s : int2str){
            ans += s;
        }

        return ans;
    }
};

关于c++ lambda匿名函数的写法可以学习 链接

也可以不转换为string,直接排序

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        string ans = "";
        sort(nums.begin(), nums.end(), [](const int& x, const int& y){
            long ratio_x = 10, ratio_y = 10;
            while(x >= ratio_x){
                ratio_x *= 10;
            }
            while(y >= ratio_y){
                ratio_y *= 10;
            }
            return ratio_y*x + y > ratio_x*y + x;
        });
        if(nums[0] == 0) return "0";
        for(auto& x : nums){
            ans += to_string(x);
        }

        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值