题解 | #把数组排成最小的数#
把数组排成最小的数
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; } };