劍指offer——把陣列排成最小的數C++

baixiaofei567發表於2020-12-28

在這裡插入圖片描述
全部轉為字串存入陣列,對其進行sort即可。
主要是cmp函式比較難寫

sort中的比較函式compare要宣告為靜態成員函式或全域性函式,不能作為普通成員函式,否則會報錯。因為:非靜態成員函式是依賴於具體物件的,而std::sort這類函式是全域性的,因此無法再sort中呼叫非靜態成員函式。靜態成員函式或者全域性函式是不依賴於具體物件的,可以獨立訪問,無須建立任何物件例項就可以訪問。同時靜態成員函式不可以呼叫類的非靜態成員。

C++中的字串可以直接比較大小,cmp比較的結果,決定了排序方式(升序或者降序)是對引數起作用,不是對A和B起作用
其實返回的是true or false,如果為真兩個數不變,如果為假則交換。
因為a本來在b前面,如果a+b<b+a,那麼證明a比b小,所以返回真,不讓其交換
http://www.manongjc.com/article/79574.html

class Solution {
public:
    static bool cmp(string a, string b){
        string s1=a+b,s2=b+a;
        //這樣就會把加起來結果小的放在前面,改為大於就是升序排列
        //如果是return a<b就把小的放前面,return a>b就把大的放前面
        //return s1<s2就是把a和b誰當前面組成的數字小,誰就放前面
        return s1 < s2;
    }
    
    string PrintMinNumber(vector<int> numbers) {
        //自定義cmp,將陣列中的所有數字轉化為string進行排序
        //將小的排在最前面,如何比較是個問題
        //怎麼樣才算小?當然是作為前面的數字來說產生的結果小才是真的小
        if(numbers.size() == 0) return "";
        vector<string> s;
        for(int i = 0; i < numbers.size(); ++i){
            s.push_back(to_string(numbers[i]));
        }
        sort(s.begin(),s.end(),cmp);
        string res = "";
        for(int i = 0; i < s.size(); ++i){
            res += s[i];
        }
        return res;
    }
};

相關文章