LeetCode-179. Largest Number

179. 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.code

由題意能夠知道,結果最大數字符串是由這些數字轉成字符串後按其降序排列而來。理解這一點這道題就簡單了。
另外須要考慮一些特殊狀況:如全是0的狀況、爲空的狀況等等。orm

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        string result;
        vector<string> arr;
        for (const auto n:nums)
        {
            arr.push_back(to_string(n));
        }

        sort(arr.begin(), arr.end(), [](const string& s1, const string& s2){return s1 + s2 > s2 + s1; });
        for (const auto& e:arr)
        {
            result += e;
        }

        if (result.at(0) == '0')
        {
            return "0";
        }
        
        return result;
    }
};

上面代碼是先將int窗口轉成相應string的容器,而後對string容器中string進行降序排序,最後排序後的string拼接成一個字符串,再排除特殊狀況便可。排序

下面給出的方法從代碼角度來看更簡潔,但性能方面會差一點,因在排序過程,每兩個int轉成字符串比較過程當中,每次to_string都會構造一個string, 而後兩個string再進行+運算符, 最後兩個string再進行>運算符,額外開銷有點大。leetcode

class Solution
{   
public:
    string largestNumber(vector<int>& nums)
    {
        string result;
        
        if (nums.empty())
        {
            return "0";
        }

        sort(nums.begin(), nums.end(), 
            [](const int n1, const int n2){return to_string(n1) + to_string(n2) > to_string(n2) + to_string(n1); });

        for (const auto e:nums)
        {
            result += to_string(e);
        }

        if (result.at(0) == '0')
        {
            return "0";
        }
        
        return result;
    }
};

上面兩種方法在leetcode上模擬運行,方法1運行大概8ms, 方法2大概28ms, 主要性能消耗仍是在排序過程當中對int數據按字符串比較排序,不斷地string隱式構造及string運算符+及>的重載。其實這裏咱們能夠將及單獨實現,優化掉這塊的消耗。字符串

class Solution
{
    static bool intAsstrCompare(int a, int b)
    {
        char aBuf[64];
        char bBuf[64];
        
        memset(aBuf, 0, sizeof(aBuf));
        memset(bBuf, 0, sizeof(bBuf));
        
        sprintf(aBuf, "%d%d", a, b);
        sprintf(bBuf, "%d%d", b, a);
        
        return strcmp(aBuf, bBuf) > 0;
    }

public:
    string largestNumber(vector<int>& nums)
    {
        string result;
        
        if (nums.empty())
        {
            return "0";
        }

        sort(nums.begin(), nums.end(), intAsstrCompare);

        for (const auto e:nums)
        {
            result += to_string(e);
        }

        if (result.at(0) == '0')
        {
            return "0";
        }
        
        return result;
    }
};

上面代碼運行後爲12ms, 居然尚未方法1快!!!有興趣的能夠接着去研究一下。string

相關文章
相關標籤/搜索