描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

示例1

输入:

[3,32,321]

复制返回值:

"321323"

思路:

这题可以看出是一道排序的题目,比如a=323,b=43  那么ab=32343,ba=43323,显然应该是a在前,b在后,整体的数值才最小。那么如何去进行比价呢?这里也才采用人家提供的一个很好的思路,将数值转换为字符串,然后通过比较字符串的大小就可以整体的比较值的大小,比如对于整数a,b,将其转换成字符串a,b后,比较字符串a+b和b+a的大小,很神奇吧,仔细想想,字符串相加正好是可以连接起来的,那么a+b就得到字符串32343,b+a就得到字符串43323,比较的是这两个字符串的大小,可以用ASCII码值进行比较,返回小的那个字符串排列,就相当于找到了数值的排列,这样整体排序完后就可以找到最小的数。注意:使用sort方法自定义函数时候,需要定义成static函数,因为sort的调用必须是静态成员。

class Solution {
public:
    static bool compare(string a,string b)
        {
            return a+b<b+a;
        }
    string PrintMinNumber(vector<int> numbers) {
        vector<string> res;
        for(int i=0;i<numbers.size();i++)
        {
            //将数值转化为字符串进行比较
            res.push_back(to_string(numbers[i]));
        }
        sort(res.begin(),res.end(),compare);
        string result;
        for(int i=0;i<res.size();i++)
        {
            result+=res[i];
        }
        return result;
    }
};