返回最大数

题目描述

给定一组非负整数 numsnumsnums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大整数

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数

示例 1

输入 :nums = 10,2

输出:"210"

示例 2

输入 :nums = 3,30,34,5,9

输出:"9534330"

数据范围

1<=nums.length<=1001 <= nums.length <= 1001<=nums.length<=100

0<=numsi<=1090 <= numsi <= 10^90<=numsi<=109

算法原理

看到题目说,重新排列每个数的顺序,能够想到要做排序,学过的排序,以对 a,ba, ba,b 降序排序为例,它们的排序规则基本都是:

  1. a<ba < ba<b,aaa 排在后面,bbb 排在前面
  2. a=ba = ba=b,a,ba, ba,b 的顺序无要求
  3. a>ba > ba>b,aaa 排在前面,bbb 排在后面

对于本题,我们观察示例 111,示例 111 中的两个数字,可以组成 102102102 和 210210210,明显 210210210 更大,所以 222 排在前面,101010 排在后面。因此本题的排序规则,以对 a,ba, ba,b 排序为例,先组合 a,ba, ba,b,获得 ab,baab, baab,ba:

  1. ab>baab > baab>ba,aaa 排在前面,bbb 排在后面
  2. ab=baab = baab=ba,a,ba, ba,b 的顺序无要求
  3. ab<baab < baab<ba,aaa 排在后面,bbb 排在前面

以上述的排序规则对数组排序,然后再将所有的数据组合即可

这道题的贪心体现在比较规则上,哪种组合更大,我就按照这种组合,让对应的数排在前面

细节问题

  1. 对于排序规则,我们最好是将数据转为字符串,然后将字符串组合,比较两个字符串的字典序,否则要计算一个数字的位数,然后再加上它
  2. 题目可能会给出 0,00, 00,0 这样的例子,此时会返回结果 "00",我们需要判断结果的第一个字符是否为 000,是 000 就返回 "0"。能这么做是因为 0,a(a>0)0, a (a > 0)0,a(a>0) 这样子的情况最终不会得到 "0a",因为 a>0a > 0a>0,它肯定被放在前面,得到的结果是 "a0"

代码

cpp 复制代码
struct cmp
{
    // sort 的比较条件只要返回 true,第一个参数就排在前面,第二个参数就排在后面
    bool operator()(string num1, string num2)
    {
        return (num1 + num2) > (num2 + num1); // > : "num1num2"   <= : "num2num1"
    }
};

class Solution {
public:
    string largestNumber(vector<int>& nums) 
    {
        vector<string> strs;
        for (int num : nums)
        {
            strs.push_back(to_string(num));
        }

        sort(strs.begin(), strs.end(), cmp());

        string ret;
        for (auto& str : strs)
        {
            ret += str;
        }
        return ret[0] == '0' ? "0" : ret;
    }
};
相关推荐
0+1111 小时前
算法 --二分查找
c++·算法·leetcode
拂拉氏1 小时前
【项目实现】 C++ vector实现(空间配置器+异常处理)
c++·vector·异常·空间配置器
qq_199886871 小时前
第8板块·第3节:设备间拷贝与点对点(P2P)传输
c++·人工智能·gpu算力·cuda
爱奥尼欧2 小时前
【C++】map、set 的底层是什么?红黑树五条性质、插入旋转到模拟实现
开发语言·数据结构·c++
汉克老师2 小时前
CSP-J 2026 初赛试题解析(第三部分:完善程序题(第二题))精讲
c++·csp-j·小学生·学c++编程
kukubuzai2 小时前
双指针系列二--末尾篇(3道题)
c++·算法·leetcode
汉克老师2 小时前
CSP-J 2026 初赛试题解析(第二部分:阅读程序题(第二题))精讲
c++·csp-j·小学生·学c++编程
神仙别闹3 小时前
基于 C++ 实现(控制台)关键字检索系统
c++
重生之小比特3 小时前
【初阶C++】stack和queue
开发语言·c++·vs·queue