Largest Number 179
题目描述:
给出一组非负整数,将这组整数拼接成一个数字,要求数字最大,用string返回这个最大的数字
For example, given [3, 30, 34, 5, 9]
, the largest formed number is 9534330
题目分析:
对于数字 a,b到底哪个在前面组成的数字大一点呢,只要比较 ab 和 ba 这两个字符串就可以了 ,如果ab>ba应该将a放到前面,反之将a放到后面
这样可以对多有整数按照上面的比较方法,按照从大到小排序;排序之后只要一个一个的拼接起来就可以了
问题:
在使用sort时碰到了点问题:
当数组中的所有元素都相同时:
如果cmp函数定义成这种格式 if(a>=b)return true; 排序之后会出现奇怪的数字,或者一直跑不出来
但是如果cmp函数定义成这种格式 if(a>b)return true; 排序就不会出现问题了
对于上面的问题只有在数据量 >=17 时才出现(应该在数据量小于17时采用的是插入排序)
之前没注意排序过后一直会出问题,用自己的排序模板类通过了
后来发现去掉“=”就没问题
原因至今不清楚。。。
代码:
1 template<class T>class Qsort{ 2 private : 3 void copy(T &a,T &b){ 4 if(&a==&b)return ; 5 char *pa=(char *)&a; 6 char *pb=(char *)&b; 7 for(int i=0;i<sizeof(T);i++)*(pa+i)=*(pb+i); 8 } 9 10 void Swap(T & a,T & b){ 11 T buf; 12 copy(buf,a); 13 copy(a,b); 14 copy(b,buf); 15 } 16 public : 17 void qsort(T d[],int l,int r,bool (*cmp)(const T& a,const T& b)){ 18 if(l>=r)return ; 19 20 Swap(d[l],d[(l+r)>>1]); 21 int last=l; 22 23 for(int i=l+1;i<=r;i++) 24 if(!cmp(d[l],d[i])) 25 Swap(d[++last],d[i]); 26 Swap(d[l],d[last]); 27 28 qsort(d,l,last-1,cmp); 29 qsort(d,last+1,r,cmp); 30 } 31 }; 32 class Solution { 33 public: 34 static string itos(int n){ 35 string ret=""; 36 if(n==0)return "0"; 37 while(n){ 38 ret=(char)(n%10+'0')+ret; 39 n=n/10; 40 } 41 return ret; 42 } 43 44 static bool cmp(const int &a,const int &b){ 45 string s1=itos(a); 46 string s2=itos(b); 47 int i; 48 string merge1=s1+s2; 49 string merge2=s2+s1; 50 if(merge1.compare(merge2)>=0)return true; 51 return false; 52 } 53 54 string largestNumber(vector<int> &num) { 55 int a[num.size()]; 56 for(int i=0;i<num.size();i++)a[i]=num[i]; 57 Qsort<int> st; 58 st.qsort(a,0,num.size()-1,cmp); 59 if(a[0]==0)return "0"; 60 string ret=""; 61 for(int i=0;i<num.size();i++) 62 ret=ret+itos(a[i]); 63 return ret; 64 } 65 };
1 static inline string itos(int n){ 2 string ret=""; 3 if(n==0)return "0"; 4 while(n){ 5 ret=(char)(n%10+'0')+ret; 6 n=n/10; 7 } 8 return ret; 9 } 10 11 static inline int cmp(const string &a,const string &b){ 12 if((a+b).compare(b+a)>0)return 1; 13 return 0; 14 } 15 16 string largestNumber(vector<int> &num) { 17 string st[num.size()]; 18 for(int i=0;i<num.size();i++)st[i]=itos(num[i]); 19 20 sort(st,st+num.size(),cmp); 21 22 if(st[0][0]=='0')return "0"; 23 24 string ret=""; 25 for(int i=0;i<num.size();i++) 26 ret=ret+st[i]; 27 return ret; 28 }