美文网首页数据结构&算法&人工智能
剑指offer编程题—把数组排成最小的数

剑指offer编程题—把数组排成最小的数

作者: 零岁的我 | 来源:发表于2020-04-07 17:10 被阅读0次

    题目描述
    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

    解题思路
    先将vector容器内的元素从小到大进行排序(需要定制排序规则),然后将排好序的元素依次拼接,得到最终答案。
    对于两个整数a,b的排序规则如下:
    先将a,b转换为字符数字,然后按照不同的顺序拼接,用拼接字符的大小关系表示两个整数的大小关系。

    1. 若ab>ba,则a>b;
    2. 若ab<ba,则a<b;
    3. 若ab=ba,则a=b.
      举例:3<32,但是拼接后的字符323<332,所以32<3.排序时32 在3前面。
    class Solution {
    public:
        string PrintMinNumber(vector<int> numbers) {
            string res;
            int len=numbers.size();
            if(len<1) return res;
            sort(numbers.begin(),numbers.end(),cmp);
            for(int i=0;i<len;++i){
                res+=to_string(numbers[i]);
            }
            return res;
        }
        static bool cmp(int a,int b){
            string x=to_string(a)+to_string(b);
            string y=to_string(b)+to_string(a);
            return x<y;
        }
    };
    

    注意:上述代码中的比较函数必须定义成静态成员函数,否则编译器会报错。
    原因是C++中函数模板sort()中的第三个参数是一个指针函数,包含两个形参,但是类的非静态函数还包含一个隐形参数(this指针),可能就是这个原因编译器才会报错吧,这也是个人揣摩,如有误请指正。

    当然,如果比较函数不定义为静态函数,也可以将比较函数定义为全局函数,在类内直接调用,如下所示:

    bool cmp(int a,int b) 
    {
         string x=to_string(a)+to_string(b);
         string y=to_string(b)+to_string(a);
         return (x<y);
    }
    class Solution {
    public:
        string PrintMinNumber(vector<int> numbers) {
            string res;
            int len=numbers.size();
            if(len<1) return res;
            sort(numbers.begin(),numbers.end(),cmp);
            for(int i=0;i<len;++i){
                res+=to_string(numbers[i]);
            }
            return res;
        }
    };
    

    相关文章

      网友评论

        本文标题:剑指offer编程题—把数组排成最小的数

        本文链接:https://www.haomeiwen.com/subject/hhpnphtx.html