把数组排成最小的数

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

思路:

对于两个数x和y,拼接结果有两种,xy和yx,两种结果的位数是相同的。所以可以按照从左往右逐位比较,如果某一位的数字较小,则较小数字所在数较小。比如如果xy的第i位(0<=i<xy.length)小于yx的第i位,则xy为较小的一个。对于三个数x、y、z,有xyz、xzy、yxz、yzx、zxy、zyx。还是一样的按位比较,如果第i位的数字最小,则最小数字所在数为最小数。考虑以下流程,先从x、y、z三个数中任取两个数拼接,取最小值,然后和最后一个数拼接,就拿到答案。其实这个过程就是排序。排序依据就是两个数的拼接结果,结果小的放在前面。

代码:

class Solution {
public:
    string minNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end(),[](int x,int y){return to_string(x)+to_string(y) < to_string(y)+to_string(x);});
        string ans;
        for(auto& num: nums) {
            ans.append(to_string(num));
        }
        return ans;
    }
};