把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
由set来维护字符串顺序,取出第一个即为最小。
解法类似于
剑指Offer:字符串的排列
http://blog.youkuaiyun.com/bestzem/article/details/52130601
其实我代码就是直接copy的,是不是发现都一样一样的。
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
if(numbers.empty()) return string{};
set<string> sr;
int sz=numbers.size();
vector<bool> bflag(sz,false);
string s{};
toGet(sr,numbers,sz,bflag,s);
return *(sr.begin());
}
public:
void toGet(set<string> &sr,vector<int> &numbers,int &sz,vector<bool> bflag,string s){
int i=0;
for(;i<sz&&bflag[i];++i);
if(i==sz){
sr.insert(s);
return;
}
for(i=0;i<sz;++i){
if(!bflag[i]){
bflag[i]=true;
stringstream ss;
ss<<numbers[i];
toGet(sr,numbers,sz,bflag,s+ss.str());
bflag[i]=false;
}
}
}
};