把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
暴力法,找到所有排列,进行比较,选出最小的字符串。
class Solution {
public:
string ans;
string PrintMinNumber(vector<int> numbers) {
vector<string> strvec;
for(int i = 0; i < numbers.size(); ++i)
{
strvec.push_back(to_string(numbers[i]));
}
dfs(strvec, 0);
return ans;
}
void dfs(vector<string>& strvec, int index)
{
if(index == strvec.size())
{
string tmp = "";
for(int i = 0; i < strvec.size(); ++i)
{
tmp += strvec[i];
}
if(ans.empty())
{
ans = tmp;
}
else
{
if(tmp < ans)
{
ans = tmp;
}
}
}
for(int i = index; i < strvec.size(); ++i)
{
swap(strvec[i], strvec[index]);
dfs(strvec, index+1);
swap(strvec[i], strvec[index]);
}
}
};
更好的方法:
我们要求的字符串最小,也就是子字符串中前面的字符串小于后面的字符串。
因此可以先排序,在进行组合。
string PrintMinNumber(vector<int> numbers) {
vector<string> strvec;
string ans ="";
for(int i = 0; i < numbers.size(); ++i)
{
strvec.push_back(to_string(numbers[i]));
}
sort(strvec.begin(), strvec.end(), [&](string a, string b){
return a+b < b+a;
});
for(int i = 0; i< strvec.size(); ++i)
{
ans+=strvec[i];
}
return ans;
}