把数组排成最小的数

题目描述

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

bool compSizeDif(const string& l, const string& r) {
    string tr = r.substr(0, l.size());
    int c = l.compare(tr);
    if (0 == c) {
        //如果相等,看大数的后(m-n)位;如果m-n<=n,直接比较小数和大数的后n位,小的在前,否则大数截取后m-n位,继续第2步
        if (r.size() - l.size() <= l.size()) {
            return l < r.substr(r.size() - l.size());
        } else {
            return compSizeDif(l, r.substr(l.size()));
        }
    }
    //位数不同,先比较小数(n位)和大数(m位)的前n位,小的在前,
    return c < 0;
}

bool compare(const string& l, const string& r)
{
    if (l.size() == r.size()) {//位数相同小的在前
        return l < r;
    } else if (l.size() < r.size()){
        return compSizeDif(l, r);
    } else {
        return !compSizeDif(r, l);
    }
}
class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        //1.位数相同小的在前
        //2.位数不同,先比较小数(n位)和大数(m位)的前n位,小的在前,
        //如果相等,看大数的后(m-n)位;如果m-n<=n,直接比较小数和大数的后n位,小的在前,否则大数截取后m-n位,继续第2步
        vector<string> strs;
        for (auto num : numbers) {
            strs.push_back(to_string(num));
        }
        sort(strs.begin(), strs.end(), compare);
        string ans;
        for (auto str : strs) {
            ans += str;
        }
        return ans;
    }
};
原文地址:https://www.cnblogs.com/jecyhw/p/6586734.html