题目链接:https://leetcode.com/problems/largest-number/
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.
思路:这一题真是非常好,在这一题学习了很多新姿势.
最初我的做法是重新写了一个快排和比较函数,WA了数次,一方面是快排的问题,一方面是比较函数的问题,终于AC了,一看代码已经70行左右了.其中比较函数我的想法是循环比较,如果长度不一样长的话已经走完的那么再从头开始走:比如这两个数243218和243,前面的一个更大.后来看了别人的发现我根本没必要重写快排,只要重写比较函数就可以了.并且我也没必要用这么麻烦的比较函数,只要比较a + b 和 b+ a的大小就可以了.
另外在整数转string我用了stringstream,但是后来发现还有一种更为简单的方式,利用c++,提供的模板to_string()函数.
最后比较函数的写法还可以用lambda演算的方式写出.
贴两份代码吧,前一个是自己写的,后一个是参照别人修改的.
代码如下:
class Solution { public: bool cmp(string& a, string& b)// if a > b { int i = 0, j = 0; while(i < a.size() && j < b.size()) { if(a[i] > b[j]) return true; else if(a[i] < b[j]) return false; i++, j++; i = i%a.size(), j = j%b.size(); if(i == 0 && j==0) break; } return false; } int partition(vector<string>& vec, int low, int high) { string val = vec[low]; while(low < high) { while(low < high && cmp(vec[high], val) == true) high--; if(low < high) vec[low++] = vec[high]; while(low < high && cmp(val, vec[low]) == true) low++; if(low < high) vec[high--] = vec[low]; } vec[low] = val; return low; } void qSort(vector<string>& vec, int low, int high) { if(low < high) { int mid = partition(vec, low, high); if(low < mid-1) qSort(vec, low, mid-1); if(mid+1 < high) qSort(vec, mid+1, high); } } string largestNumber(vector<int>& nums) { int len = nums.size(), tem; string str; stringstream ss; vector<string> vec(len); for(int i =0; i< len; i++) ss << nums[i] << " "; for(int i = 0; i< len; i++) ss >> vec[i]; qSort(vec, 0, len-1); ss.str(""); for(int i = len -1; i >= 0; i--) { //cout << vec[i] << endl; ss << vec[i]; } ss >> tem; if(tem == 0) return "0"; return ss.str(); } };
class Solution { public: string largestNumber(vector<int>& nums) { int len = nums.size(); string result; vector<string> vec(len); for(int i = 0; i< len; i++) vec[i] = to_string(nums[i]); sort(vec.begin(), vec.end(), [](string &a, string &b){ return a+b < b+a;});//c++中lambda演算 for(int i = len -1; i >= 0; i--)//将排过序的字符保存起来 result += vec[i]; if(result[0] == '0') return "0"; return result; } };第二种参考:https://leetcode.com/discuss/83870/7-line-c-code-with-proof