把数组排成最小的数(剑指offer)string+vector

把数组排成最小的数
  • 参与人数:909时间限制:1秒空间限制:32768K
  • 通过比例:20.12%
  • 最佳记录:0 ms|0K(来自  TOBEORNOTTOBE)

题目描述

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

链接:http://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking


题意:。。。。中文就不重复了,


讲讲我的思路:一开始我想把数字转成字符串,然后排序即可,最后就是连起来;

于是我把每个字符不齐25位,不够的在后面加'A',类似于16进制的表示,

后来测试没过(3,3332,33334 结果应该是3332333334)

发现自己好像想复杂了,其实只要比较字符a+b和b+a的大小就可以了,按照从小到大排序;

class Solution {
public:
 
    string PrintMinNumber(vector<int> numbers) {
        if(!numbers.size()) return "";
        string st("");
        int len=numbers.size();
        vector<string> tmp(len);
        int i=0,j=0;
        while(i<len)
        {
            int cnt=0;
            string s("");
            while(numbers[i])
            {
                s+='0'+numbers[i]%10;
                numbers[i]/=10;
                cnt++;
            }
            //逆转;当然用数组直接装会更好点
            string::reverse_iterator rit;
            rit=s.rbegin();
            while(rit!=s.rend()) {tmp[j]+=*rit; rit++;}
            i++;
            j++;
        }
        sort(tmp.begin(),tmp.end(),cmp);
        for(int i=0;i<len;i++)
        {
            st+=tmp[i];//.substr(0,tmp[i].find_first_of('A'));
        }
        return st;
    }
    static bool cmp(string a,string b)
    {
        return a+b<b+a;
    }
};

当然这里还有一个很好用的库函数to_string() ,不过是c++11的新标准,我用的是codeblocks,没有加,所以自己写了个。

你可能感兴趣的:(字符串,剑指offer)