把数组排成最小的数

题目描述

来源于 https://leetcode-cn.com/

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [10,2]
输出: "102"

示例 2:

输入: [3,30,34,5,9]
输出: "3033459"

提示:

  • 0 < nums.length <= 100

说明:

  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

解法:

一个数的最高位越小,把它放在前面时,构成的数字也就越小。但是如果两个数字 a 和 b 的最高位相同怎么办?此时单从数字本身来确定谁前谁后,是挺麻烦的。但是可以比较 str(a)+str(b)str(b)+str(a) 的大小,如果前者小,自然 a 应该在 b 的前面。

class Solution {
public:
    string minNumber(vector<int>& nums) {
        vector<string> strs;
        strs.reserve(nums.size());
        transform(nums.begin(), nums.end(), back_inserter(strs), [](int n){
            return to_string(n);
        });
        sort(strs.begin(), strs.end(), [](string &a, string &b){
            if(a[0] < b[0]){
                return true;
            }else if(a[0] > b[0]){
                return false;
            }else{
                return a + b < b + a;
            }
        });
        ostringstream os;
        copy(strs.begin(), strs.end(), ostream_iterator<string>(os));
        return os.str();
    }
};