Given a list of non negative integers, arrange them such that they form the largest number.
leetcode上的一道給定一個整形數組然後求其怎樣進行組合才能得到一個最大的值,由於可能太大,會導致溢出,要求返回string類型而非整形。下面是我的剛開始的想法:
拿例題來說,給定一個數組[3,30,34,5,9],求其能組成的最大數值。很自然的想法就是將最大的值排在最靠前的位置,然後依次將第二大、第三大在後面排序即可。問題是由於各個數是多少位不能確定。後來又想先將數組中的每個整形轉換爲字符串之後進行左對齊,然後按照最左邊的首先進行排序,在左邊排完序之後根據從左往右數的第二位進行降序排序。但是這樣也會出現一個小問題,就是比如一個是3,另一個是30和34.左對齊之後是如表格所示:在左邊位數相同的情況下,第二位缺省的要比第二位有數字的要排在靠前的位置,這種做法比較麻煩。
後參考http://www.cnblogs.com/easonliu/p/4221810.html 這篇博客中的做法,覺得比自己的做法要好,代碼copy過來,留以後方便查看。
<pre name="code" class="cpp"><span style="font-family:Times New Roman;font-size:14px;">bool cmp(const string s1, const string s2) {
return (s1 + s2) > (s2 + s1);
}
class Solution {
public:
string largestNumber(vector<int> &num) {
vector<string> s_num(num.size());
stringstream stream;
for (int i = 0; i < num.size(); ++i){
stream << num[i];//將整形輸入至流
stream >> s_num[i];//將流輸出至string的vector中。
stream.clear();
}
sort(s_num.begin(), s_num.end(), cmp);
string res;
bool flag = false;
for ( int i = 0; i < s_num.size(); ++i){
<span style="white-space:pre"> </span>if (s_num[i] != "0"){
<span style="white-space:pre"> </span>res += s_num[i];
<span style="white-space:pre"> </span>flag = true;
}
else if (flag)
res += s_num[i];
if (!flag) res.push_back('0');
return res;
}
};</span>