今日题目:leetcode179------点击跳转题目
分析:
要把这些数组组成最大的数,首先我们把数字转化为字符串,根据自定义的排序规则把这些字符串字数排列,再用一个字符串接受这些字符串数字拼接成最大的字符串数字
排序规则:
对于两个字符串数字s1和s2,有两种拼接方式:s1+s2 或 s2+s1,如果前者更大,那么就让s1在s2的前面,如果后者更大,就让s2在s1的前面
代码:
class Solution {
public:
static bool cmp(string s1, string s2)
{
return s1 + s2 > s2 + s1;
}
string largestNumber(vector<int>& nums)
{
vector<string> v_str;
for(auto x : nums)
{
string str = to_string(x);
v_str.push_back(str);
}
sort(v_str.begin(),v_str.end(),cmp);
string ans;
for(auto& x : v_str)
{
ans += x;
}
//特判:如果第一个就是0,说明后面的也都是0,只用输出一个0才符合数字特征
if(ans[0] == '0') ans = "0";
return ans;
}
};
tips1:关于sort的自定义排序
bool cmp(T a,T b);
sort(左区间,右区间,cmp);
在自定义排序时,
cmp
函数的返回值用于判断两个元素是否需要交换顺序。如果cmp
函数返回true
,则表示两个元素a、b的顺序不变,不需要交换;如果cmp
函数返回false
,则表示两个元素a、b的顺序需要交换,sort
函数会将它们交换位置。我们只需根据想要的排序规则,来判断两个元素如果满足排序规则,就返回true,反之false
本题中,如果s1+s2 > s2+s1 ,则说明满足排序规则,返回true,故而我们可以直接返回这个表达式的bool值即可
tips2:为什么cmp函数要设置成静态函数?
在 C++ 中,
sort
函数需要一个普通的函数指针(或者可调用对象,比如 lambda 表达式、函数对象等),而不是类成员函数指针。
类成员函数(非静态)与普通函数有一个重要的区别:类成员函数隐式地传递了一个指向调用对象的指针(通常称为
this
指针)。因此,成员函数的签名与普通函数的签名不同,不能直接作为一个普通函数指针传递。
静态成员函数不依赖于特定对象,它们不需要
this
指针。因此,它们的签名与普通函数相同,可以作为普通函数指针传递。这就是为什么在这个例子中,cmp
函数需要声明为静态成员函数的原因。