1. 程式人生 > >[C++]LeetCode: 128 Largest Number (自定義比較函式排序)

[C++]LeetCode: 128 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.

思路:

貪心演算法:

貪心思路:對於兩個備選數字a和b, 如果str(a) + str(b) > str(b) + str(b), 則a在b之前,否則b在a之前,按照這個原則對原陣列從大到小排序即可。我們只需要寫出sort函式的自定義比較函式即可,注意的是,這裡比較函式必須為靜態函式。還有我們,要注意一個特殊情況,如果字串後的字串從0開始,我們返回“0”。

貪心思路是比較簡單的方法,如果我們將數字轉成字串,然後從左到右逐個字元比較,字首相同的話,還有很多其他情況需要考慮。而利用一個自定義比較函式,對所有字元進行比較,就可以得到正確結果。

首先,我們將num轉成字串存入陣列,然後根據自定義比較函式排序,之後再對排序後的字串連線成一個字串,最後排除特殊情況,得到所求結果。

Attention:

1. 注意特殊情況,如果字串開頭含0,最後返回“0”

2. sort中的比較函式compare要宣告為靜態成員函式或全域性函式,不能作為普通成員函式,否則會報錯。Line 26: invalid use of non-static member function

因為:非靜態成員函式是依賴於具體物件的,而std::sort這類函式是全域性的,因此無法再sort中呼叫非靜態成員函式。靜態成員函式或者全域性函式是不依賴於具體物件的, 可以獨立訪問,無須建立任何物件例項就可以訪問。同時靜態成員函式不可以呼叫類的非靜態成員。

//自定義比較函式 
    static bool compare(string &s1, string &s2)
    {
        return s1 + s2 > s2 + s1;
    }

3. sort 比較函式

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
比較函式必須在第一個引數被認為小於,等於或大於第二個引數時分別返回一個小於,等於或大於零的整數。以此來表示兩個引數的關係。成功返回true, 失敗返回false. 複雜度:O(nlg(n)) 排序演算法複雜度

AC Code:

class Solution {
public:
    string largestNumber(vector<int> &num) {
        vector<string> arr;
        
        //將num轉成string存入陣列
        for(int i : num)
            arr.push_back(to_string(i));
            
        //比較排序
        sort(arr.begin(), arr.end(), compare);
        
        //連線成字串
        string ret;
        for(string s : arr)
            ret += s;
        
        //排除特殊情況
        if(ret[0] == '0' && ret.size() > 0) 
            return "0";
        
        return ret;
    }
    
private:
    //自定義比較函式 
    static bool compare(string &s1, string &s2)
    {
        return s1 + s2 > s2 + s1;
    }
};