leetcode -- Largest Number

来源:互联网 发布:深圳it外包公司 编辑:程序博客网 时间:2024/05/01 04:55

原题:

Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

该题最好的解法就是对序列进行排序,关键在于排序的比较函数。比较的准则是:看比较函数的两个参数按一前一后两种法案,拼接成字符串后,那种方案得到的字符串字典序大。

这里,借用这题来比较C中的qsort函数和STL中sort函数的区别。

解法一:使用C中的qsort函数。

string IntToStr(int n) {string res;if(n == 0) {res += '0';return res;}while(n) {res += n % 10 + '0';n /= 10; }reverse(res.begin(), res.end());return res;}int CMP(const void *iter1, const void *iter2) {string s1, s2;int * it1 = (int *)iter1;int * it2 = (int *)iter2;s1 = IntToStr(*it1);s2 = IntToStr(*it2);if(s1 + s2 < s2 + s1)return 1;else if(s1 + s2 > s2 + s1)return -1;elsereturn 0;}class Solution {public:    string largestNumber(vector<int> &num) {int* a = new int[num.size()];for(int i = 0; i != num.size(); i++)a[i] = num[i];//vector<int>::iterator it1 = num.begin();//vector<int>::iterator it2 = num.end();int (*cmpfunp)(const void *, const void *);cmpfunp = CMP;        qsort(a, num.size(), sizeof(int), cmpfunp);string res;for(int i = 0; i != num.size(); i++) {res += IntToStr(a[i]);}int flag = 0;for(int i = 0; i != res.size(); i++) {if(res[i] != '0'){flag = 1;break;}}if(flag == 0) {res = "0";}return res;}};
需要注意的是,void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

四个参数分别是:

1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
函数指针的形式必须是int (*fcmp)(const void *, const void *), const不能少,void也不能换成其他类型,只能在比较函数的内部根据实际比较的元素类型进行强制类型转换。因为qsort是C中的函数,其内部机制是直接操作void类型的指针,因此不能对C++中的容器进行直接排序,此题规定输入时vector<int>,所以如果非要使用qsort,只能用int数组暂存vector<int>。

使用qsort对其他类型进行排序时也有一些需要注意的地方,详见博客:http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html

解法二:使用STL中的sort函数。

string IntToStr(int n) {string res;if(n == 0) {res += '0';return res;}while(n) {res += n % 10 + '0';n /= 10; }reverse(res.begin(), res.end());return res;}bool STL_CMP(int &a, int &b) {string s1, s2;s1 = IntToStr(a);s2 = IntToStr(b);if(s1 + s2 > s2 + s1)return true;else return false;}class Solution {public:    string largestNumber(vector<int> &num) {sort(num.begin(), num.end(), STL_CMP);string res;for(int i = 0; i != num.size(); i++) {res += IntToStr(num[i]);}int flag = 0;for(int i = 0; i != res.size(); i++) {if(res[i] != '0'){flag = 1;break;}}if(flag == 0) {res = "0";}return res;}};
STL中的sort函数有多个重载的版本,第三个参数(比较函数)可以省去,如果省去,则默认是产生一个按operate<排列的序列。

sort的第三个参数可以函数指针(如以上代码),也可以是仿函数。如果是函数指针,则形式应该是bool (*cmp)(TYPE &a, TYPE &b),返回值是bool,而qsort的返回值是int。

这里的sort和qsort一样是非稳定排序,STL中的排序算法还有其他变种,如stable_sort等。

关于STL中的sort详见博客:

http://blog.163.com/lovelychicken0824@126/blog/static/2277337420071894051206/

http://www.cppblog.com/mzty/archive/2005/12/15/1770.html

0 0