0
点赞
收藏
分享

微信扫一扫

剑指Offer45—把数组排成最小的数

力扣

题意

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

解题思路

此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 x 和 y ,则规定 排序判断规则 为:

  • 若拼接字符串 x + y > y + x ,则 x “大于” y ;
  • 反之,若 x + y < y + x,则 x “小于” y ;

x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。

根据以上规则,套用任何排序方法对 nums 执行排序即可。

算法流程:

  1. 初始化: 字符串列表 strs,保存各数字的字符串格式;
  2. 列表排序: 应用以上 “排序判断规则” ,对 strs 执行排序;
  3. 返回值: 拼接 strs 中的所有字符串,并返回

C++实现

class Solution 
{
public:
    string minNumber(vector<int>& nums) 
    {
        //1、初始化字符串列表strs,保存各数字的字符串格式
        vector<string> strs;
        for(auto& num:nums)
        {
            strs.push_back(to_string(num));
        }
        //2、列表排序,应用排序规则,对strs进行排序
        quick_sort(strs,0,strs.size()-1);
        //3、拼接strs中的所有字符串,并且返回
        string res;
        for(auto& str:strs)
        {
            res.append(str);
        }
        return res;
    }
    void quick_sort(vector<string>& strs,int l,int r)
    {
        //递归出口
        if(l>=r)
            return;
        int i=l,j=r;
        while(i<j)
        {
            while(i<j&&strs[j]+strs[l]>=strs[l]+strs[j])
                --j;
            while(i<j&&strs[i]+strs[l]<=strs[l]+strs[i])
                ++i;
            swap(strs[i],strs[j]);
        }
        swap(strs[i],strs[l]);
        quick_sort(strs,l,i-1);
        quick_sort(strs,i+1,r);
    }
};

 

举报

相关推荐

0 条评论