原题:
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; else return 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 *));
四个参数分别是:
使用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
原文:http://blog.csdn.net/lc_910927/article/details/43899443