LeetCode最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:"210"
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
思路:
这道题的意思很容易理解,但是解法却不容易想。我们普遍的思路是这样:我们希望数组相连组成的数字最大,那么肯定要比较所有数的第一个数字,第一个数字越大,我们就越把它排在前面,比如在示例2中的数字9要放在最前面;如果第一个数字一样,我们就按第二数字排序,以此类推……然而,这种方法每次都要考虑所有的数字,而且每个数字的具体位数也不统一,实现起来会很麻烦。
好啦,我直接说可行的思路吧:我们不从所有数字的第1位出发,而是从数组的第一位出发。我们的目标不就是要对数组进行一个“排序”吗,我们就先确定第1位要放哪个数,再确定第2位……如果你计算机基础较好,你应该可以马上意识到,这种排序的顺序正是选择排序。
我们写两层循环,第一层i从前向后,第二层j从i+1向后,相当于我们拿第一个位置的值与后面所有的值进行“比较”;再拿第二个位置的值和后面所有的值“比较”……这里的比较并不是单纯地比数值大小,而是比较二者拼在一起时,谁在前时更大,就把谁放前面。这样,通过选择排序的方式,我们就按顺序选出了第1位,第2位,乃至最后一位的元素,这样选出的结果数组,是完全符合我们的题目要求的。
代码:
class Solution(object):
def largestNumber(self, nums):
s = ''
#就按自己的选择排序来 比较前后相连哪个大,后者大就交换
for i in range(len(nums)-1):#选择排序,两层循环
for j in range(i+1,len(nums)):
#如果正着拼接比反过来拼接小
if str(nums[i])+str(nums[j]) < str(nums[j])+str(nums[i]):
nums[i],nums[j] = nums[j],nums[i]#就交换值
#现在nums已经排序完毕
for x in (nums):#直接将这些元素拼接起来就可以啦
s += str(x)
return str(int(s)) #这一步并不多余,直接返回s会错
代码中最后一步没有直接return s,看起来有点多余。这是因为LeetCode提交的时候有个用例是对于[0,0]的情况,预期结果是0,而不是00,因此最后一步我们对于s先转成int,再转回str,这样就可以把00先变成0了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了