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.左对齐之后是如表格所示:在左边位数相同的情况下,第二位缺省的要比第二位有数字的要排在靠前的位置,这种做法比较麻烦。
3 | |
3 | 4 |
3 | 0 |
后参考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>