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 }

 

posted @ 2015-01-14 14:47  li-xingtao  阅读(135)  评论(0编辑  收藏  举报