自定义排序规则剑指 Offer 45. 把数组排成最小的数

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义排序规则剑指 Offer 45. 把数组排成最小的数相关的知识,希望对你有一定的参考价值。

我是小张同学,立志用更简洁的代码做更高效的表达


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

示例 1:
输入: [10,2]
输出: “102”

示例 2:
输入: [3,30,34,5,9]
输出: “3033459”

提示:
0 < nums.length <= 100

说明:

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


核心思路:自定义排序规则进行排序, 可以使用快排,也可以使用自带的sort排序函数


内置函数版

class Solution {
public:
    string minNumber(vector<int>& nums) {
        string res;
        vector<string>tem;
        // 将int转换成string
        for(int i = 0; i < nums.size(); i++)
            tem.push_back(to_string(nums[i]));

        // 排序、赋值
        sort(tem.begin(), tem.end(), cmp);
        for(int i = 0; i < tem.size(); i++)
            res += tem[i];
        return res;
    }
    static int cmp(string s1, string s2) {
        return s1+s2 < s2+s1;
    }
};

快排版

class Solution {
public:
    string minNumber(vector<int>& nums) {
        vector<string>tem;
        string res;
        // 将int转换成string
        for(int i = 0; i < nums.size(); i++)
            tem.push_back(to_string(nums[i]));

        // 排序、赋值
        quickSort(tem, 0, tem.size()-1);
        for(int i = 0; i < tem.size(); i++)
            res += tem[i];
        return res;
    }

private:
    void quickSort(vector<string>& tem, int l, int r) {
        if(l >= r) return;
        int temp = l;
        int left = l, right = r;
        while(left < right) {
            while(tem[right] + tem[temp] >= tem[left] + tem[temp] && left < right) right--;
            while(tem[left] + tem[temp] <= tem[right] + tem[temp] && left < right) left++;
            swap(tem[left], tem[right]);
        }
        swap(tem[temp], tem[left]);
        quickSort(tem, l, left - 1);
        quickSort(tem, left + 1, r);
    }
};

有志者,事竟成,破釜沉舟,百二秦关终属楚。

苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

以上是关于自定义排序规则剑指 Offer 45. 把数组排成最小的数的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 45. 把数组排成最小的数(自定义排序,Java)

剑指 Offer 45. 把数组排成最小的数(自定义排序,Java)

剑指 Offer 45. 把数组排成最小的数

剑指Offer:把数组排成最小的数45

剑指 Offer 45. 把数组排成最小的数-排序(179. 最大数)

剑指offer第32题:把数组排成最小的数及关于list.sort()和sorted( Iterable object )函数的相关知识