题解 | #把数组排成最小的数#

把数组排成最小的数

http://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993

第七十一题
知道把什么数放在前面得到的值最小。
答案重写的排序就是拼接起来更小的,最好从数学的角度理解一下。
看一下下面四种怎么拼接。

第一种 第一位两个都不一样,则直接选择第一位小的放前面即可
321,111

123,111
321,333
第二三种 第一位都一样,第二位一个小,一个大
也就是说,第一位一样的时候,扔掉第一位
23,11
21,33
再重新进行比较,这样就找到了递归比较的条件
假设
123123111,123123122
两个比较
123123都一样
所以只剩下111比较122。1也一样,就是11比22,所以11放前面。

第四种 一各数长一个数短
第四种1 删不完,方法同上,先把一样的数字删掉,在比较
1234 125,就变成34比5 所以1234放前面
123 13 就变成23 比3 所以123 放前面
第四种2 全删完了,就要特殊考虑,比较剩下的数,和原数第一个数谁大
2115 211:都删211 变为5和没有,这个时候看5和2谁小 所以是2112115
9851 985:都删985,变为1和没有,比较1和9,所以是9851985



答案:修改比较函数
class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        // 位数已经确定了,所以要把第一位最小的数放前面
        vector<string> str;
        for (int i=0;i<numbers.size();i++)
            str.push_back(to_string(numbers[i]));
        
        // 答案 重写sort的比较函数返回定义,修改为拼接两个字最小的放前面,最后直接遍历拼接
        sort(str.begin(), str.end(), compare);
        
        string ret = "";
        for (int i=0;i<str.size();i++) 
            ret += str[i];
        return ret;
    }
    
    static bool compare(string a, string b) {
        return a + b < b + a;
    }
};

题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务