[32]把数组排成最小的数

来源:互联网 发布:ps二维码源码 编辑:程序博客网 时间:2024/06/05 22:17

[32.]把数组排成最小的数

时间限制:1秒
空间限制:32768K

本题知识点: 数组

题目描述

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

牛客网题目链接:点击这里

VS2010代码:

#include<iostream>#include<vector>using namespace std;class Solution {public:    string PrintMinNumber(vector<int> numbers) {        string str; //用来存储最后返回值        //将数字转化为字符存储起来        if(numbers.empty()) return str;        vector<string> Nums;        for(int i=0; i!=numbers.size(); i++)        {            Nums.push_back(int2str(numbers[i]));        }        //快速排序将str正确排序。        strQuickSort(Nums, 0, Nums.size()-1);        //将字符串串起来        for(int i=0; i<Nums.size(); i++)        {            str.append(Nums[i]);        }        return str;    }    string int2str(int n)    {   //输入一个正整数,将其转换为字符串        string str;        int length=0;        int base=1;        int temp=n;        while(temp)        {            if(temp>10)                base=base*10;            length++;            temp=temp/10;           }        str.resize(length);        for(int i=0; i<length; i++)        {            //cout<<(n/base)%10;            str[i]=(n/base)%10+'0';            base=base/10;        }        return str;    }    //两个字符串的比较    bool IsBegerThan(const string &str1, const string &str2)    {  //假设不存在,3和33的这种类似情况        int i=0,j=0;        while(i!=str1.size() && j!=str2.size())        {            if(str1[i]<str2[j]) return 0;            if(str1[i]>str2[j]) return 1;            if(str1[i]==str2[j])            {                if(i+1==str1.size() && j+1!=str2.size())                    j++;                else if(i+1!=str1.size() && j+1==str2.size())                    i++;                else                {i++;j++;}            }        }        return 0; //相等的情况计入<=0;    }    //改进的字符串的快速排序    void strQuickSort(vector<string> &nums, int begin, int end)    {//选取第一个字符串作为枢纽元        if(begin>=end) return;        string viot=nums[begin];        int pBegin=begin;        int pEnd=end;        while(pBegin!=pEnd)        {   //枢纽元左边为小于等于,右边均大于            while(pBegin!=pEnd && IsBegerThan(nums[pEnd], viot))                pEnd--;            while(pBegin!=pEnd && !IsBegerThan(nums[pBegin], viot))                pBegin++;            if(pBegin!=pEnd)                swap(nums[pBegin],nums[pEnd]);        }        if(begin!=pEnd)            swap(nums[begin],nums[pEnd]);        strQuickSort(nums,begin,pEnd-1);        strQuickSort(nums,pEnd+1,end);    }};int main(){    Solution s1;    //string str;    //vector<int> test1;    //int int1=3;    //int int2=32;    //int int3=321;    //test1.push_back(int1);    //test1.push_back(int2);    //test1.push_back(int3);    //str=s1.PrintMinNumber(test1);    //for(int i=0; i<str.size(); i++)    //  cout<<str[i];    vector<string> str;    string str1="3";    string str2="32";    string str3="321";    ////string str4="31";    ////string str5="321";    //str.push_back(str1);    //str.push_back(str2);    //str.push_back(str3);    ////str.push_back(str4);    ////str.push_back(str5);    //s1.strQuickSort(str,0,2);    ////string str3;    ////str3=str1.append(str2);    //for(int i=0; i<str.size(); i++)    //{    //  for(int j=0; j<str[i].size(); j++)    //      cout<<str[i][j];    //  cout<<endl;    //}    cout<<s1.IsBegerThan(str2,str3)<<endl;}

牛客网通过图片:

这里写图片描述
这里写图片描述

0 0
原创粉丝点击