剑指offer-把数组排成最小的数

描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
 
这题重点不是求解,而是lambda表达式和仿函数的使用,以减轻我们的编码工作量。
 
 1 struct Com {
 2     bool operator() (string a, string b) {
 3          return a + b < b + a;
 4     }
 5 };
 6 
 7 class Solution {
 8 public:
 9     
10     string PrintMinNumber(vector<int> nums) {
11          // 可以将数字后面的位都按前面的补充,如3补充为333,32补充为322
12         // 经过一次排序,就可以确定组合顺序=》感觉是对的,但不知道为什么对=》尽量先不试
13         
14         
15         // 看题解,用贪心策略:如果字符串a+b<b+a,那么肯定希望a在b前面
16         // 其实函数返回值是string,就应该往这方面想了
17         vector<string> str;
18         for(int val:nums){
19             str.push_back(to_string(val));
20         }
21         
22         // 用lambda或仿函数,这样就不用我们自己写字符串排列函数了
23         // lambda表达式,更加方便,类似于js中的回调函数
24 //         sort(str.begin(),str.end(),[](string a,string b){
25 //             return a+b<b+a;
26 //         });
27         
28         // 仿函数
29         sort(str.begin(),str.end(),Com());  // Com为临时对象
30         
31         string ret="";
32         for(string s:str){
33             ret+=s;
34         }
35         return ret;
36     }
37 };
心之所愿,永不相忘
原文地址:https://www.cnblogs.com/zgll/p/15073182.html