演算法設計與分析課作業【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;
}
};