LeetCode 179——最大數(排序)

一、題目介紹

給定一組非負整數,重新排列它們的順序使之組成一個最大的整數。

示例 1:

輸入: [10,2]
輸出: 210
示例 2:

輸入: [3,30,34,5,9]
輸出: 9534330
說明: 輸出結果可能非常大,所以你需要返回一個字符串而不是整數。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/largest-number
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

二、解題思路

       需要將傳入的數組,按照指定的規則進行排序,最後再將排序數組中的元素從頭到尾,添加到一個字符串中返回。本題難點在於自己定義排序規則。降序排序規則如下:

(1)當兩個數的高位不同,高位大的數排在前面。

(2)當兩個數的高位相同,且位數相同時,從左到右比較每一位的數,大的排在前面。比如[30,34],排序後爲[34,30]。

(3)當兩個數的高位相同,且位數不同時,如[32, 321],對於321而言,32後面的每一位都需要大於32的首位3,才能排到前面排序後爲[32,321]。如果[32, 324],排序後爲[324,32]。

(4)當兩個數的高位相同,且位數不同時,如[12,121],當按照(3)的規則無法判斷,因爲121後面的1,與12的首位1相同,這時需要比較12的末尾2,與121的末尾1之間的大小關係。因此排序後爲[12,121]。

(5)需要考慮,所有元素均相同的情況。

(6)需要考慮,輸出的字符串不能爲“01”,“00”之類的結果。

三、解題代碼

bool comp(const int& a, const int& b)
{
    string ls = to_string(a);
    string rs = to_string(b);
    int ln = ls.size();
    int rn = rs.size();
    char lc, rc;
    for(int i = 0; i < ln || i < rn; ++i)
    {
        if(i < ln)
            lc = ls[i]; //取某一位數
        else
            lc = ls[0]; //ls爲rs的前綴,將當前字符賦值爲ls的首位字符
        if(i < rn)
            rc = rs[i];
        else
            rc = rs[0]; //rs爲ls的前綴
        if(lc == rc)
            continue;
        else
            return lc > rc;
    }
    if(ls[ln-1] != rs[rn-1])  //如121和12的情況,需要比較兩個字符串的末尾字符
        return ls[ln-1] > rs[rn-1];
    return false; //全都相等的情況
}
class Solution {
public:    
    string largestNumber(vector<int>& nums) {
        int n = nums.size();
        string res;
        if(n == 0)
            return res;
        sort(nums.begin(), nums.end(), comp);
        for(int i = 0; i < n; ++i)
        {
            if(nums[0] == 0) //避免數字的最前面爲0
            {
                res = "0";
                break;
            }
            res += to_string(nums[i]);
        }
        return res;
    }
};

四、解題結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章