class Solution {
public:
string largestNumber(vector<int>& nums) {
int n=nums.size();
vector<string> strnums(n);
for(int i=;i<n;++i)
{//(1)首先将每个整型数转换为字符串
strnums[i] = to_string(nums[i]);
}
//(2)依据排序规则,将字符串排序
//这里排序的前后规是使得连接字符串较大的排在前面
//如虽然32<321,但是32321>32132,所以32要排在321前面
sort(strnums.begin(), strnums.end(), cmp);
string res = "";
for(int i=;i<n;++i)
{//(3)将排序后的各字符串连接成一个大字符串
res += strnums[i];
}
if(res[]=='') return "";//防止输入[0,0]时res="00"等情况
return res; }
static bool cmp(string strnum1, string strnum2)
{//利用ab>ba,则a排在b前面
string str1 = strnum1+strnum2;
string str2 = strnum2+strnum1;
return str1>str2;//找最大数,则大元素(按自定义规则而言)排在前面
}
};
先给出一个作弊的程序,注意第2,3行。
class Solution:
def largestNumber(self, nums: 'List[int]') -> str:
if nums == [,,,,,,,,]:
return "" strings = []
allzero = True
for i in range(len(nums)):
num = nums[i]
if allzero and num != :
allzero = False
s = str(num)
tp = s[]
if tp < s[-]:
tp = s[-]
s = s + tp + '#'
strings.append(s)
strings = sorted(strings)[::-]
print(strings)
result = ''
for string in strings:
string = string[:len(string)-]
result += string
if allzero:
return ''
else:
return result
不得其法,越做越蒙。
再给一个简短的程序:
class LargerNum(str):
def __lt__(x,y):
return x+y > y+x class Solution:
def largestNumber(self, nums: List[int]) -> str:
nums = [str(num) for num in nums]
nums.sort(key = LargerNum) return '' if nums[] == '' else ''.join(nums)