LeetCode最大数

179. 最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1

输入:nums = [10,2]

输出:"210"

示例 2

输入:nums = [3,30,34,5,9]

输出:"9534330"

思路:

       这道题的意思很容易理解,但是解法却不容易想。我们普遍的思路是这样:我们希望数组相连组成的数字最大,那么肯定要比较所有数的第一个数字,第一个数字越大,我们就越把它排在前面,比如在示例2中的数字9要放在最前面;如果第一个数字一样,我们就按第二数字排序,以此类推……然而,这种方法每次都要考虑所有的数字,而且每个数字的具体位数也不统一,实现起来会很麻烦。

       好啦,我直接说可行的思路吧:我们不从所有数字的第1位出发,而是从数组的第一位出发。我们的目标不就是要对数组进行一个“排序”吗,我们就先确定第1位要放哪个数,再确定第2位……如果你计算机基础较好,你应该可以马上意识到,这种排序的顺序正是选择排序

       我们写两层循环,第一层i从前向后,第二层ji+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了。

posted @   JunanP  阅读(22)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示