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;
        }
    };
  • 相关阅读:
    show()的几种方法
    sql的交叉连接,内连接,左外连接,右外连接,全外连接总结
    MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
    RedHat9通过Host-only配置网络连接
    解决Struts2.2.20版本的标签不支持style属性的问题
    SQL查询数据库中所有含有某一列的所有表
    简单工厂模式
    vc常用类总结(转载)
    嵌入式程序员应知道的0x10个C语言Tips
    C语言位操作
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8076207.html
Copyright © 2011-2022 走看看