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

题目链接: leetcode

题目实质是排序规则的设计:

nums任意两数字m,n的字符串格式为 x 和 y ,则
若拼接字符串 x + y > y + x,则 m > n
反之,若 x + y < y + x,则 n < m

传递性证明:
若字符串 x+y < y+x , y+z < z+y ,需证明 x+z < z+x 一定成立。
题解

/*
执行用时:8 ms, 在所有 C++ 提交中击败了82.96%的用户
内存消耗:11.2 MB, 在所有 C++ 提交中击败了55.71%的用户
*/
class Solution {
public:
    string minNumber(vector<int>& nums) {
         vector<string> str;
		 for(auto num : nums)
		 {
		 	str.push_back(to_string(num));
		 } 
		 //修改内置函数的排序规则
		 sort(str.begin(), str.end(), [&](string x, string y){
		 	if(x + y < y + x) return true;
		 	return false;
		 });
		 string ans;
		 for(auto s : str)
		 {
		 	ans += s;
		 }
		 return ans;
    }
};

或者定义静态排序方法:

class Solution {
public:
    string minNumber(vector<int>& nums) {
        vector<string> strs;
        string res;
        for(auto num:nums) strs.push_back(to_string(num));
        sort(strs.begin(),strs.end(),cmp);//需调用静态方法
        for(auto str:strs) res+=str;
        return res;
    }
    static bool cmp(const string&a,const string&b){return a+b<b+a;}
};
/*
作者:moao
链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/cpp-onlognzi-ding-yi-pai-xu-by-moao-fjqp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值