剑指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 };
心之所愿,永不相忘