题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
3
32
321
先转化成string数组,从第一位开始,对数组遍历,找出第i位最小的数,如果都一样,就再次遍历,找出第i+1位最小的数,找到就将这个数从数组汇中删去
代码
#include<sstream>
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
vector<string> strings;
string result="";
int length=numbers.size();
if(length==0) return string();
//转string,并统计最长的长度
int longest=0;
for(int i=0;i<length;i++){
stringstream stream;
stream<<numbers[i];
string str=stream.str();
if(str.size()>longest) longest=str.size();
strings.push_back(str);
}
//遍历vector,寻找第i位数字最小的,将其append到结果中,并从strings中删除
while(strings.size()>0){
length=strings.size();
string min=strings.front();
int minindex=0;
bool hasmin=false;
for(int i=0;i<longest;i++){
for(int j=0;j<length;j++){
if(find(strings[j],i)<=find(min,i)){
min=strings[j];
minindex=j;
//如果这个数跟最小的数当前位的值一样,还得看他们的下一位
if(find(strings[j],i)==find(min,i)){
continue;
}else{
hasmin=true;
}
}
}
if(hasmin) break;//如果没有最小的,即这一位上所有数字都一样,就往下一位找
}
result.append(min);
strings.erase(strings.begin()+minindex);
}
return result;
}
char find(string str,int pos){
int len=str.size();
if(pos>=len) return str.at(len-1);
return str.at(pos);
}
};