題目分析
原題:
給定一組非負整數 nums,重新排列每個數的順序(每個數不可拆分)使之組成一個最大的整數,
注意:輸出結果可能非常大,所以你需要回傳一個字串而不是整數,
分析:
這道題題意不難理解,暴力解法的思路也不難想,但是實作起來其實是比較困難的,而且時間復雜度遠遠達不到要求,因此要考慮能夠減小時間復雜度的邏輯,同時要注意,回傳的是字串,
思路分析
我們可以先拿兩個數{5,34}舉例子,這兩個數在不拆分的情況下,可以組成的整數個數為兩個,534和345,顯然534要更大,因此要測驗用例為這兩個數,則答案就是”534“,
那么我們該如何用代碼實作呢?大家可以觀察,534和345這兩個數字是怎么得到的,是不是像是用了一種特殊的加法,而字串與數字型別不同,誰在前,加出來的結果是有區別的,因此,這種加法的原理跟字串的拼接一樣,所以自然而然想到把所有的數字轉換為字串進行拼接,這是解題的精髓之一,
回傳這個例子{5,34},假如資料不變,而順序變了呢,即{34,5},我們能夠判斷出來,這個整數是534,那么我們如何將這個整數以字串形式回傳呢?
可能小伙伴覺得,這不簡單嘛?但是這是在只有兩個數字的情況下,如果整個字串陣列包括很多元素,我們要按什么原則將這個整數拼接起來呢?沒錯,呼之欲出,排序,
排序原則的構造也是解題的精髓之一,大家可以這么思考,如果一個字串拼接容器中任何一個其他的字串所得到的整數,都大于其他的字串拼接它,那么這個字串就應該放在首位,因為其他任何一個字串放在首位都不如它大,因此排序的原則應當是:字串1+字串2>字串2+字串1(其實小于也可以,無非就是最后for回圈的順序從頭遞增還是從尾遞減,不過還是建議大于),
下面是我所寫的代碼實作:
class Solution {
public:
static bool compare(string a,string b){//排序規則
return a+b>b+a;
}
string largestNumber(vector<int>& nums) {
string str;//用于作回傳值
vector<string>str_nums;//用于裝轉換string型別后nums容器中的data
for(auto i:nums){//C++11新特性
str_nums.push_back(to_string(i));//to_string函式用于將i變數對應的data轉換為string型別
}
sort(str_nums.begin(),str_nums.end(),compare);//排序
if(str_nums[0]=="0"){
return "0";//避免輸入為{0,0,0}全是0的情況下輸出很多個0,此時輸出1個0即可
}
for(auto j:str_nums){
str+=j;/字串從頭到尾拼接
}
return str;
}
};
關于排序規則compare函式,為什么設定為靜態成員函式,請大家看我的博客《Debug:reference to non-static member function must be called》,里面有詳細的解釋,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/276660.html
標籤:其他
