zoukankan      html  css  js  c++  java
  • 剑指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 };
    心之所愿,永不相忘
  • 相关阅读:
    软件工程师的属性与发展
    欢迎使用CSDN-markdown编辑器
    hdu 5446 lucas+crt+按位乘
    poj 2891 模数不互质的中国剩余定理
    3037 插板法+lucas
    poj 1006中国剩余定理模板
    codeforce E
    UVA10820 send a table
    UVA1635 Irrelevant Elements
    uva 10375 Choose and Divide
  • 原文地址:https://www.cnblogs.com/zgll/p/15073182.html
Copyright © 2011-2022 走看看