返回最大数

题目描述

给定一组非负整数 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;
    }
};
相关推荐
INGNIGHT1 小时前
944 · 最大子矩阵(前缀和)
数据结构·c++·算法
All for pursuit.2 小时前
【动态规划-6】96.不同的二叉搜索树
数据结构·c++·算法·leetcode·动态规划
大鹏的NLP博客3 小时前
C++ 内存安全的未来:从 Safety Profiles 到 Safe C++
c++·内存安全
程序员zgh3 小时前
C++ erase() 函数用法
c语言·开发语言·c++·学习
All for pursuit.4 小时前
【并查集-2】399.除法求值
数据结构·c++·算法·leetcode
程序喵大人5 小时前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr
汉克老师6 小时前
CSP-S 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-s·小学生·学c++编程
_wyt0016 小时前
洛谷 P10112 [GESP202312 八级] 奖品分配 题解
c++·数学·gesp·八级
朝朝辞暮i6 小时前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法
殷色玫瑰6 小时前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio