这道题的关键在于找到一个巧妙的比较函数。
在论坛里看到某位大神的经典之作,代码如下:
class Solution {
public:
string largestNumber(vector<int> &num) {
vector<string> arr;
for(auto i:num)
arr.push_back(to_string(i));
sort(begin(arr), end(arr), [](string &s1, string &s2){ return s1+s2>s2+s1; });
string res;
for(auto s:arr)
res+=s;
while(res[0]=='0' && res.length()>1)
res.erase(0,1);
return res;
}
};
上述代码用了许多c++11的新特性,可以查阅相关资料了解。
巧妙的地方在于两点:
1.认识到这里直接用数字比较是不合适的,而用字符串形式比较正好符合要求。我之前就是傻傻的将两个数字究竟有几位整理出来,然后再从高位向低位比较,多了不必要的麻烦。
2.通过s1+s2>s2+s1这样巧妙的比较方式进行比较,注意到每次考虑第n个数字时,之前考虑的n-1个数字已经摆放到位,因此只需要局部最大即可得到全局最大。