剑指offer32 - 把数组排成最小的数(c++)

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

题解:可以用全排列的做法找到最小的数,但是这样就会使得最后得结果要在n!个数中进行比较,这样比较的次数和最后的结果个数太多,所有我们可以用下面的办法,只需要在sort()函数中自定义一个Compare,让按照Compare的规则将比较后的数进行排列,得到的就是最小值。
全排列代码链接: https://blog.csdn.net/ADream__/article/details/105145908

class Solution {
public:
    static bool Compare(int a,int b){
        string strNum1=to_string(a);//数字转字符串
        string strNum2=to_string(b);
        return (strNum1+strNum2)<(strNum2+strNum1);
    }
    string PrintMinNumber(vector<int> numbers) {
        string str;
        if(numbers.empty())
            return str;
        sort(numbers.begin(),numbers.end(),Compare);//排序规则
        for(int i = 0; i < numbers.size();i++)
            str += to_string(numbers[i]);
        return str;
    }
};

关于sort的第三个参数的定义: 强烈推荐看技术文档
可以看到Compare的定义:Compare函数返回一个bool类型的值,这个值表示了在严格弱排序中(可以理解为升序排序)第一参数是否位于第二个参数之前。

也就是说如果comp返回true,则第一个参数小于第二个参数,sort根据compare的返回值将第一个参数排在第二个参数之前。
如果comp返回false,则第一个参数大于第二个参数,sort根据compare的返回值将第一个参数排在第二个参数之后。

传入A,B,定义bool myfunction (int i,int j) { return (i<j); },作为comp函数,则排列AB。
传入BA,则排列AB。
可以看出是升序排列的。(sort函数默认的comp函数也是默认升序的)

而如果我们定义bool myfunction (int i,int j) { return (i>j); },作为comp函数,
传入AB,返回false,则排列为BA,
传入BA,返回true,排列为BA。
是降序排列的。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值