剑指offer刷题————把数组排成最小的数

问题重述: 

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

思路解析:

首先,因为拼接起来的数可能会超出范围,因此用字符串来存储。

我们需要一个最小的数,细想一下可知,如果有两个字符串a,b
如果a + b < b + a, 显然我们希望a排在b的前面,因为a排在前面可以使结果更小。于是我们就自定义排序规则,使得vector中字符串都满足如上规则,那么最后的结果肯定是最小的。

代码实现:

class Solution {
public:
    string PrintMinNumber(vector nums) {
        vector str;
        for (int val : nums) str.push_back(to_string(val));
        sort(str.begin(), str.end(), [](string a, string b) {
            return a + b < b + a;
        });
        string ret = "";
        for (string s : str) ret += s;
        return ret;
    }
};

 

你可能感兴趣的:(刷题)