题目
Given a list of non negative integers, arrange them such that they form the largest number.
Example 1:
Input: [10,2]
Output: "210"
Example 2:
Input: [3,30,34,5,9]
Output: "9534330"
Note: The result may be very large, so you need to return a string instead of an integer.
题目的要求是将一个整数数组的数进行组合,形成一个最大的整数,这个整数可以非常大,所以单纯的int、long long int也可能放不下,需要返回一个字符串来代替。
这个题目的关键是如何将整数要如何组合才能是最大的数,我们考虑组合的方式,当两个整数想要组成最大的数的话,很明显哪个整数的最高位最大,哪个整数就要放在前面。
但要是两个整数的最高位一样大,我们就需要比较接下来的位数,这样想直接用整数来比较就得一位一位来很麻烦,那我们可以想到string类型也是可以直接比较的,在本题中,将整数转为string类型来比较时就会变得很方便。
但同时,转为string类型进行比较也存在着一个问题,当整数的位数不同且最高位相同,string的比较就会没办法确定哪个先哪个后了,但是string有加法呀,既然不能确定哪个先哪个后,那我直接把这两个先后加起来比较不就好了。
假设有两个string a和b,我们就直接将a + b 和b + a进行比较就行了。
这样我们基本就完成了,再利用一下C++中的sort函数,将所有的串进行比较排序,这样从头到尾加起来便是一个最大的整数了。
不过最后我们还要注意的一点是,万一给出的数组很坑,数组中的数全是0,那这样我们将串加起来的结果就会是0000……,这样结果就不对了,应该直接返回0就好了,所以我们最后需要判断一下得到的串的第一个字符是不是0,如果是,那也就是说之后的数不会存在比0还大的数,不然0就不可能在串的第一个,所以只要是就直接返回“0”就行了。这也是leetcode上我没考虑到所以出现的错误情况,为此做下提醒。
C++代码如下:
class Solution {
public:
string largestNumber(vector<int>& nums) {
vector<string> str_nums;
for (int i = 0; i < nums.size(); ++i) {
str_nums.push_back(to_string(nums[i]));
}
sort(str_nums.begin(), str_nums.end(), Compare);
string result_str;
for(int i = 0; i < str_nums.size(); ++i) {
result_str += str_nums[i];
}
return result_str[0] == '0' ? "0" : result_str;
}
/*该自定比较函数在leetcode上需要声明为static, 某些平台或许不用,
虽然官方文档没有说明,但很多平台还是有这个要求,可能是为了避免this的指向错误吧*/
static int Compare(string& a, string& b) {
return a + b > b + a;
}
};