Largest Number
leetcode
sort
题意
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.
Note: The result may be very large, so you need to return a string instead of an integer..
思路:
1 对于两个备选数字a和b, 如果str(a) + str(b) > str(b) + str(b), 则a在b之前,否则b在a之前,按照这个原则对原数组从大到小排序即可。我们只需要写出sort函数的自定义比较函数即可,注意的是,这里比较函数必须为静态函数。还有我们,要注意一个特殊情况,如果字符串后的字符串从0开始,我们返回“0”。
2 首先,我们将num转成字符串存入数组,然后根据自定义比较函数排序,之后再对排序后的字符串连接成一个字符串,最后排除特殊情况,得到所求结果。
注意:
1 注意特殊情况,如果字符串开头含0,最后返回“0”
2 sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错. Line 26: invalid use of non-static member function
因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中调用非静态成员函数。静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。
code
class Solution {
public:
string largestNumber(vector<int> &num) {
vector<string>res;
for(int i = 0; i < num.size(); i++) {
//if(num[i] == 0) {
// res.push_back("0");
// continue;
//}
//string r;
//IntToString(num[i], r);
//res.push_back(r);
res.push_back(to_string(num[i]));
}
sort(res.begin(), res.end(), cmp);
string s;
for(int i = 0; i < res.size(); i++) {
s += res[i];
}
// special case, since arranged by descending order,
// just judge the first element of res is "0",
if(res[0] == "0") return "0";
return s;
}
void IntToString(int num, string& res) {
if(num == 0) return;
IntToString(num / 10, res);
res += (num % 10) + '0';
}
private:
static bool cmp(const string& a, const string& b) {
return a + b > b + a;
}
};