题目描述:
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
示例 1:
输入: [10,2]输出: 210
示例 2:
输入: [3,30,34,5,9]输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
要完成的函数:
string largestNumber(vector<int>& nums)
说明:
1、这道题给定一个vector,里面存放着int类型的非负整数,要求把这些非负整数拼起来,尽可能拼成一个最大的整数。
比如[10,2],可以拼成102,也可以拼成210,最大的整数就是210,那么返回210,以字符串的形式。
2、这道题关键在于判断,判断vector中的两个数谁大谁小,谁应该放在前面。
举个例子,比如[3,30,31,32,33,34,35,102,9,990],大家觉得应该怎么排序?
我们要尽可能让大的数字放在前面,所以首位肯定要放个大一点的,那么就是9了,其余的都是3,放在首位不合适。
那么9有两个,要放9还是990,这里要对这两个数的组合做个判断。
一种是9990,一种是9909,所以还是9-990这种组合。
那么接下来呢,9-990之后呢?3跟30比,一种是330,一种是303,所以还是3在30前面。
那3跟31比呢,一种是331,一种是313,还是3在31前面。
是不是所有短的数字都要放在前面?
其实不是的,比如3和34,一种是334,一种是343,还要考虑到后面这一位的情况。
所以最终排列下来,“降序”排列,是[9,990,35,34,33,3,32,31,30]。
按照这个vector从前往后添加到要返回的字符串中,就可以了。
这道题的关键在于判断谁在前谁在后,比较的方法也很普通,就是补齐两个字符串,比较谁大谁小。
当然在实际操作中,没有必要真的对字符串补齐,我们同样可以操作。
代码如下:(附详解)
static bool cmp(int &a1,int &b1)//自定义一个比较函数,大的放前面 { string a=to_string(a1),b=to_string(b1);//先把两个整数转化为字符串,操作起来比较方便 int s1=a.size(),s2=b.size(); if(s1b[i])//如果发现a中的某一位数值已经大于b中同一位的数值,比如4和39 return true;//那么比较到此结束,4要放在前面 else if(a[i] b[i])//如果满足条件,那么a要放在前面 return true; else if(b[i-s1] b[s2-s1+i]) return false; } return false;//如果上述比较都没出结果,比如3和333,那么返回false,这里随便拼都可以 } else if(s1>s2)//如果a长b短,一样的比较方式 { for(int i=0;i b[i]) return true; } for(int i=s2;i a[i]) return false; else if(a[i-s2] a[s1-s2+i]) return true; else if(b[i] b[i]) return true; else if(a[i]