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

力扣

题意

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

剑指Offer45—把数组排成最小的数_第1张图片

解题思路

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

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

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

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

剑指Offer45—把数组排成最小的数_第2张图片

算法流程:

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

C++实现

class Solution 
{
public:
    string minNumber(vector& nums) 
    {
        //1、初始化字符串列表strs,保存各数字的字符串格式
        vector 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& strs,int l,int r)
    {
        //递归出口
        if(l>=r)
            return;
        int i=l,j=r;
        while(i=strs[l]+strs[j])
                --j;
            while(i

 

你可能感兴趣的:(剑指Offer,剑指offer,数据结构,c++,leetcode,算法)