您的位置:首页 > Web前端

【剑指offer-解题系列(33)】把数组排成最小的数

2017-05-28 17:39 501 查看


题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析
主要思想是实现一个比较函数cmp,然后利用这个函数进行排序,得到最终序列,排序方法使用快排,冒泡均可。
代码实现
    string PrintMinNumber(vector<int> numbers) {

        if(numbers.size()<=0)

            return "";

        vector<string> strs;

        char tmp[256]={'\0'};

        for(auto a = numbers.begin();a!=numbers.end();a++)

        {

            sprintf(tmp ,"%d", *a );

            strs.push_back(string(tmp
4000
));

        }

        qsort(strs,0,strs.size()-1);

        string res;

        for(auto a = strs.begin();a!=strs.end();a++)

        {

            res+=*a;

        }

        return res;

    }

    void qsort(vector<string>&numbers,int start,int end){

        if(start>=end)

            return;

        string value = numbers[end];

        int ind = start;

        for(int i = start;i<end;i++){

            if( cmp(numbers[i],value,0,0)<0){

             swap(numbers[i],numbers[ind++]);   

            }

        }

        swap(numbers[ind],numbers[end]);

        qsort(numbers,  start,ind-1);

        qsort(numbers,  ind+1,end);

       

    }

    int cmp(string& a,string& b,int start_a,int start_b){

        unsigned long i=start_a,j=start_b;

        while(i<a.size()&&j<b.size())

        {  

            if(a[i]>b[j])

                return 1;

            else if(a[i]<b[j])

                return -1;

            else{

                i++;

                j++;

            }

        }

        if(i==a.size()&&j==b.size())

            return 0;

       

        else if(i==a.size())

            return cmp(a,b,0,j);

        else if(j==b.size())

            return cmp(a,b,i,0);

       

        return 0;

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: