1. 程式人生 > >演算法設計與分析課作業【week8】leetcode--179. Largest Number

演算法設計與分析課作業【week8】leetcode--179. Largest Number

題目

Given a list of non negative integers, arrange them such that they form the largest number.

Example 1:

Input: [10,2]
Output: "210"

Example 2:

Input: [3,30,34,5,9]

Output: "9534330"

Note: The result may be very large, so you need to return a string instead of an integer.

題目的要求是將一個整數陣列的數進行組合,形成一個最大的整數,這個整數可以非常大,所以單純的int、long long int也可能放不下,需要返回一個字串來代替。

這個題目的關鍵是如何將整數要如何組合才能是最大的數,我們考慮組合的方式,當兩個整數想要組成最大的數的話,很明顯哪個整數的最高位最大,哪個整數就要放在前面。

但要是兩個整數的最高位一樣大,我們就需要比較接下來的位數,這樣想直接用整數來比較就得一位一位來很麻煩,那我們可以想到string型別也是可以直接比較的,在本題中,將整數轉為string型別來比較時就會變得很方便。

但同時,轉為string型別進行比較也存在著一個問題,當整數的位數不同且最高位相同,string的比較就會沒辦法確定哪個先哪個後了,但是string有加法呀,既然不能確定哪個先哪個後,那我直接把這兩個先後加起來比較不就好了。

假設有兩個string a和b,我們就直接將a + b 和b + a進行比較就行了。

這樣我們基本就完成了,再利用一下C++中的sort函式,將所有的串進行比較排序,這樣從頭到尾加起來便是一個最大的整數了。

不過最後我們還要注意的一點是,萬一給出的陣列很坑,陣列中的數全是0,那這樣我們將串加起來的結果就會是0000……,這樣結果就不對了,應該直接返回0就好了,所以我們最後需要判斷一下得到的串的第一個字元是不是0,如果是,那也就是說之後的數不會存在比0還大的數,不然0就不可能在串的第一個,所以只要是就直接返回“0”就行了。這也是leetcode上我沒考慮到所以出現的錯誤情況,為此做下提醒。

C++程式碼如下:

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> str_nums;
        for (int i = 0; i < nums.size(); ++i) {
            str_nums.push_back(to_string(nums[i]));
        }
        sort(str_nums.begin(), str_nums.end(), Compare);
        string result_str;
        for(int i = 0; i < str_nums.size(); ++i) {
            result_str += str_nums[i];
        }
        return result_str[0] == '0' ? "0" : result_str;
    }
    /*該自定比較函式在leetcode上需要宣告為static, 某些平臺或許不用,
      雖然官方文件沒有說明,但很多平臺還是有這個要求,可能是為了避免this的指向錯誤吧*/
    static int Compare(string& a, string& b) {
        return a + b > b + a;
    }
};