一、題目介紹
給定一組非負整數,重新排列它們的順序使之組成一個最大的整數。
示例 1:
輸入: [10,2]
輸出: 210
示例 2:
輸入: [3,30,34,5,9]
輸出: 9534330
說明: 輸出結果可能非常大,所以你需要返回一個字符串而不是整數。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/largest-number
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
二、解題思路
需要將傳入的數組,按照指定的規則進行排序,最後再將排序數組中的元素從頭到尾,添加到一個字符串中返回。本題難點在於自己定義排序規則。降序排序規則如下:
(1)當兩個數的高位不同,高位大的數排在前面。
(2)當兩個數的高位相同,且位數相同時,從左到右比較每一位的數,大的排在前面。比如[30,34],排序後爲[34,30]。
(3)當兩個數的高位相同,且位數不同時,如[32, 321],對於321而言,32後面的每一位都需要大於32的首位3,才能排到前面排序後爲[32,321]。如果[32, 324],排序後爲[324,32]。
(4)當兩個數的高位相同,且位數不同時,如[12,121],當按照(3)的規則無法判斷,因爲121後面的1,與12的首位1相同,這時需要比較12的末尾2,與121的末尾1之間的大小關係。因此排序後爲[12,121]。
(5)需要考慮,所有元素均相同的情況。
(6)需要考慮,輸出的字符串不能爲“01”,“00”之類的結果。
三、解題代碼
bool comp(const int& a, const int& b)
{
string ls = to_string(a);
string rs = to_string(b);
int ln = ls.size();
int rn = rs.size();
char lc, rc;
for(int i = 0; i < ln || i < rn; ++i)
{
if(i < ln)
lc = ls[i]; //取某一位數
else
lc = ls[0]; //ls爲rs的前綴,將當前字符賦值爲ls的首位字符
if(i < rn)
rc = rs[i];
else
rc = rs[0]; //rs爲ls的前綴
if(lc == rc)
continue;
else
return lc > rc;
}
if(ls[ln-1] != rs[rn-1]) //如121和12的情況,需要比較兩個字符串的末尾字符
return ls[ln-1] > rs[rn-1];
return false; //全都相等的情況
}
class Solution {
public:
string largestNumber(vector<int>& nums) {
int n = nums.size();
string res;
if(n == 0)
return res;
sort(nums.begin(), nums.end(), comp);
for(int i = 0; i < n; ++i)
{
if(nums[0] == 0) //避免數字的最前面爲0
{
res = "0";
break;
}
res += to_string(nums[i]);
}
return res;
}
};