【LeetCode】179. 最大数

106 阅读3分钟

image.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 本题只有一个参数数组nums,元素都是非负数整数。
    • nums数组长度1~100,num[i]范围在0~10^9

二、思路分析:

我们拿到本题,题目介绍很简单,要求对数组nums整数元素进行拼接组合成一个最大数。看完示列,发现又是一道🔥脑的题目(眼睛会,手不会)。

  • 遇到困难的题目,我们也要硬着头皮思考,扰扰脑袋思考🤔,很容易想到列表元素两两比较方法:

    • 因为nums数组中元素的都是整数,我们需要将元素转化成字符串str()
    • 取出两个元素num1,num2,进行转化成str(num1),str(num2)
    • 两个字符串交换位置,转化成整数比较大小,int(str(num1) + str(num2)) < int(str(num2)+str(num1))
    • 将较大的与较小的交换位置num1,num2 = num2,num1
  • 方法一:暴力求解

  • 解决了元素之间比较的问题,现在就需要对nums列表元素进行比较排序:

    • 最简单的方法就是:使用嵌套for循环
    • 第一层for循环:索引i取值范围0~len(nums)-1
    • 第二层for循环:索引j取值范围i+1~len(nums)
    • 对nums[i],nums[j]两个元素进行交换比较
    • 直到遍历完nums元素,然后将元素进行转换成str类型,并拼接字符串res

    这里,需要对最高为0进行处理,所以返回是需要对res类型转化整数字符串转化str(int(res))

    根据以上思路,我们使用python不难实现,代码如下:

    class Solution(object):
        def largestNumber(self, nums):
            """
            :type nums: List[int]
            :rtype: str
            """
    
            ans = ""
    
            for i in range(len(nums)-1):
    
                for j in range(i+1,len(nums)):
    
                    if int(str(nums[i]) + str(nums[j])) < int(str(nums[j])+str(nums[i])):
    
                        nums[i],nums[j] = nums[j],nums[i]   
            for num in nums:
                ans = ans + str(num)
    
            return str(int(ans))
    
  • 方法二:sort()排序

    • nums列表中元素拼接可以使用sort()排序的cmp字段
    • 排序的规则通过lambda. lambda x, y: 1 if x + y < y + x else -1
    nums_str = map(str,nums)
    compare = lambda x, y: 1 if x + y < y + x else -1
    nums_str.sort(cmp=compare)
    res = "".join(nums_str)
    if res[0] == "0":
       res = "0"
    return res
    

三、总结:

本题主要考察对数组元素进行排序处理,最简单的方式使用嵌套for循环遍历。借用sort()函数,执行效率快很多,AC记录如下: image.png

时间复杂度O(N*logN),空间复杂度O(N)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~