[leetcode] 179. Largest Number 解题报告

题目链接: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


你可能感兴趣的:(LeetCode,快速排序,sort)