题解 | #把数组排成最小的数#
把数组排成最小的数
http://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
sort(numbers.begin(),numbers.end(),[](const auto &a,const auto &b)
{
vector<int> anum;
vector<int> bnum;
int numa=a,numb=b;
while(numa)
{
anum.push_back(numa%10);//按位数从小到大排序
numa/=10;
}
//reverse(anum.begin(), anum.end());//按位数高到低排序
while(numb)
{
bnum.push_back(numb%10);//按位数从小到大排序
numb/=10;
}
//reverse(bnum.begin(), bnum.end());//按位数高到低排序
int i=anum.size()-1,j=bnum.size()-1;
while(i>=0 && j>=0)
{
if(anum[i]!=bnum[j])
{
return anum[i]<bnum[j];
}
i--;
j--;
}//这一部分没问题
//关键在于后面部分,比如3和3334作比较 a,b比较
//对于左边a,当低位i的值小于高位i+1的值,不用调换,因此anum[i]<anum[i+1]为判断条件
if(a>b)
{
while(i>=0)//i从小位到大排序
{
if(anum[i]!=anum[i+1])
{
return anum[i]<anum[i+1];
}
i--;
}
}
//对于左边b,当低位i的值大于高位i+1的值,不用调换。因此bnum[j]>bnum[j+1]为判断条件
if(a<b)
{
while(j>=0)
{
if(bnum[j]!=bnum[j+1])
{
return bnum[j]>bnum[j+1];
}
j--;
}
}
return a<b;
});
string ans="";
for(auto &num:numbers)
{
ans+= to_string(num);
}
return ans;
}
};
查看12道真题和解析