【leetcode-179】最大数

https://leetcode-cn.com/problems/largest-number/

Description

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

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

Solution

将数字全部转为字符串,进行逐个比较,比较规则为:

  • 从最高位开始比较,如果第一个数字较大,则把较大的排在前面
  • 比较后续数字,将出现更大数字的数排在前面
  • 若数字a为数字b的前缀,或相反,则返回a+b>b+a,判断如何构造可以使得数字更大

注意数字全为0的情况

sort里用lambda很香

Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> nums_str;
        bool zero_flag = false;
        nums_str.clear();
        for (auto num : nums) {
            if (num != 0) zero_flag = true;
            nums_str.push_back(to_string(num));
        }
        if (!zero_flag) return "0";
        sort(nums_str.begin(), nums_str.end(), [](const string &a, const string &b) -> bool {
            if (a[0] != b[0]) {
                return a[0] > b[0];
            } 
            for (int i = 1; i < min(a.size(), b.size()); i++) {
                if (a[i] == b[i]) continue;
                return a[i] > b[i];
            }
            return a + b > b + a;
        });
        string ans = "";
        for (auto str : nums_str) {
            ans += str;
        }
        return ans;
    }
};
0%