把数组排成最小的数
- 参与人数:909时间限制:1秒空间限制:32768K
- 通过比例:20.12%
- 最佳记录:0 ms|0K(来自 TOBEORNOTTOBE)
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
题意:。。。。中文就不重复了,
讲讲我的思路:一开始我想把数字转成字符串,然后排序即可,最后就是连起来;
于是我把每个字符不齐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,没有加,所以自己写了个。