废话
俺又回来了,在开学刷了一百多题的leetcode之后,临时抱佛脚做了一些CSP认证的题,就去参加认证了,备受打击,继续回到leetcode!
题目
我一开始以为字典序逆序就可以了,结果还有3、30这样的,就不太行。其实,这道题的核心思路是:相同长度的数字字符串(”330“ > “303”)的大小和原来数字(330 > 303)大小等价,注意是相同长度。然后题目就简单了,只需要重写sort函数按照两数拼接比较大小得出谁在前谁在后
class Solution {
public:
static bool cmp(const string& s1, const string& s2)
{
return s1 + s2 > s2 + s1;
}
string largestNumber(vector<int>& nums) {
vector<string> ss;
for(int v : nums)
ss.push_back(to_string(v));
sort(ss.begin(), ss.end(), cmp);
if(ss[0] == "0") return "0";
string ans = "";
for(auto i : ss)
ans += i;
return ans;
}
};
- 有个坑是:0、0、0这样的不需要输出“000”,而是”0“;
- 然后说一下这个sort重载
我一开始自己写了一个类封装了个string,有点麻烦。然后是这样写的。
bool cmp(const string& s1, const string& s2) { return s1 + s2 > s2 + s1; }
报错了:reference to non-static member function must be called
博主给出的原因是sort函数需要一个普通函数指针,但我们写在Solution类中是一个非静态成员函数,这样的函数都有一个隐含参数this指针,这两个函数指针是不同的,但是静态成员函数没有this指针,就可以传进去。
leetcode给出的题解中是这样写的
sort(v.begin(), v.end(), [](const string &a,const string &b){
return a+b > b+a; //两个字符串先后组合大小降序排列
});
等我晚上再研究一下STL中的sort是咋说的,争取看明白!