题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
class Solution { public: string PrintMinNumber(vector<int> numbers) { if(numbers.size() == 0){ return ""; } //冒泡排序,把较大的数不断往后挪,沉到数组的底部 for(int i=0;i<numbers.size()-1;i++){ for(int j=0;j<numbers.size()-1-i;j++){ int temp; int minn = Min(numbers[j],numbers[j+1]); if(minn == numbers[j+1]){ //后面比前面小,此时要交换 temp = numbers[j+1]; numbers[j+1] = numbers[j]; numbers[j] = temp; } } } string ans; for(int i=0;i<numbers.size();i++){ ans += itos(numbers[i]); } return ans; } string itos(int a){ if(a==0){ return "0"; } string ans; while(a!=0){ int ta = a%10; ans += (ta+'0'); a = a/10; } for(int i=0,j=ans.length()-1;i<j;i++,j--){ char temp; temp = ans[i]; ans[i] = ans[j]; ans[j] = temp; } return ans; } int Min(int a,int b){ if(a==0){ return b; } if(b==0){ return a; } int ta,tb; int pa=a,pb=b; while(true){ if(a==0 && b==0){ //说明a,b相等 return a; }else if(a!=0 && b==0){ //32 与 132,932的比较 ta = a%10; if(ta<tb){ return pa; } if(ta>tb){ return pb; } a /= 10; }else if(a==0 && b!=0){ //132,932与 32的比较 tb = b%10; if(ta<tb){ return pa; } if(ta>tb){ return pb; } b /= 10; }else{ //32,321的比较 ta = a%10; tb = b%10; if(ta<tb){ return pa; } if(ta>tb){ return pb; } a /= 10; b /= 10; } } } };