zoukankan      html  css  js  c++  java
  • 31 把数组排成最小的数 + 仿函数的写法就记忆这个就行了

    题目描述

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
     
     
    思路:
    1)使用permutation全排列的思路,和字符串全排列很像,只不过需要处理压入之后弹出的操作,以及压入结果的判断条件。
    记住字符串操作string类型可以直接进行相加,比如a + b = ab;不需要考虑a的结束符号,而且size不包含最后的结束符号。
    class Solution {
    public:
        void helper(vector<int> &numbers,vector<bool> &visit,string &tmp,string &result,int flag){
            if(flag == tmp.size()){
                if(tmp < result){
                    result = tmp;
                }
            }
            for(int i = 0;i < numbers.size();++i){
                if(i != 0 && numbers[i] == numbers[i - 1] && visit[i - 1] == false || visit[i] == true){
                    continue;
                }
                visit[i] = true;           
                string i2str =  to_string(numbers[i]);
                int len = i2str.size();
                tmp += i2str;
                helper(numbers,visit,tmp,result,flag);
                while(len-- > 0){
                    tmp.pop_back();
                }           
                visit[i] = false;
            }
        }
        string PrintMinNumber(vector<int> numbers) {
            if(numbers.empty()){
                return "";
            }       
            int sz = numbers.size();
            string test;
            for(int num : numbers){
                test += to_string(num);
            }
            vector<bool> visit(sz,false);
            string tmp;       
            string result(11,'9');
            helper(numbers,visit,tmp,result,test.size());
            return result;
        }
    };
    全排列版本

    2)定制比较函数版本。

    sort的定制函数写法是:

    方法1:声明外部比较函数

    比较函数必须写在类外部(全局区域)或声明为静态函数,static可以在函数的全局用,传进去的less是一个函数指针,所以直接可以调用less。

    当comp作为类的成员函数时,默认拥有一个this指针,这样和sort函数所需要使用的排序函数类型不一样。

    static bool Less(const Student& s1, const Student& s2){  
        return s1.name < s2.name; //从小到大排序  
    }  
    std::sort(sutVector.begin(), stuVector.end(), Less);  

    方法2:重载类的比较运算符//这个放在类里面,如果是内置类型就可以直接写在程序中。

    bool operator<(const Student& s1, const Student& s2) {  
        return s1.name < s2.name; //从小到大排序  
    }  
    std::sort(sutVector.begin(), stuVector.end());  

    方法3:声明比较类,传入的部分是个对象,()也是一个对象,也可以写cmp  a,然后传入一个a。内部的sort第三个参数猜测是一个引用,这样就可以调用这个对象的operator方法。

    struct Less{  
        bool operator()(const Student& s1, const Student& s2)  
        {  
            return s1.name < s2.name; //从小到大排序  
        }  
    };    
    std::sort(sutVector.begin(), stuVector.end(), Less()); 
    class Solution {
    public:
        struct cmp{
            bool operator()(const string &lhs,const string &rhs){        
                string a = lhs + rhs;
                string b = rhs + lhs;
                return a < b;
            }
         };
        bool cmp1(const string &lhs,const string &rhs){
            string a = lhs + rhs;
                string b = rhs + lhs;
                return a < b;
        }
        string PrintMinNumber(vector<int> numbers) {
            if(numbers.empty()){
                return "";
            }
            vector<string> str;
            for(int num : numbers){
                str.push_back(to_string(num));
            }
            string res;        
            sort(str.begin(),str.end(),cmp());//cmp ()创建一个空对象,这样里面才可以调用
            for(string tmp : str){
                res.append(tmp);
            }
            return res;
        }
    };
  • 相关阅读:
    ESP8266 wifi钓鱼
    九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)
    关于Http 传输二维json
    Android6.0权限大全和权限分类
    Android 多线程-----AsyncTask详解
    关于加密(转载文章)
    java基础之:匿名内部类
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    java多线程之:SynchronousQueue队列
    Hibernate之:各种主键生成策略与配置详解
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8076207.html
Copyright © 2011-2022 走看看