面试腾讯遇到这道题也是不容易呀

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

问题描述

179. 最大数

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

示例:

输入:nums = [10,2]

输出:"210"

分析问题

一开始拿到这个问题,第一印象不就是把整型数组排个序吗,这也太简单了吧,python一行代码搞定,点击提交,瞬间被打脸。连示例都没有跑通。

image.png

image-20211118115801221

对于 nums=[10,2],排序输出后的结果是102,而正确的结果是210。所以我们不能简单的比较。

根据观察,要想得到的数最大,就得保证生成的数的最高位尽可能的大才行,所以我们就需要把数值大的数放在高位。于是,我们通过比较数组的每个元素的最高位,最高位相同的时候比较次高位(这正好不就是字符串比较吗),以此类推,完成排序,然后把它们拼接起来。心里想,这下应该十拿九稳了,直接写代码,提交。

image-20211118115910035

额,再一次被打脸,这我。。。

要不算了吧,直接回去吧,卷不动了。

image.png

怎么能这么轻易放弃呢?搞起来。

我们来看一下,这种排序方式对于输入数组没有相同数字开头的时候是有效的,比如[10,2],但是对于数组中有相同数字开头的情况就不满足了。例如3,30和3,35。

  • 对于3,30 ,因为 330 > 303,所以需要把3放在前面。

  • 对于3,35,因为 353 > 335,所以需要把35放在前面。

因此我们需要比较两个数不同的拼接顺序的结果,进而决定它们在结果中的排列顺序。所以对于数组nums中的任意两个值a和b,我们只能根据拼接后的结果来决定他们的先后顺序。

所以通过上述排序规则,我们就可以求出最大数,证明过程去LeetCode官方解答查看。

下面我们来看一下代码的具体实现。

import functools
class Solution:
    def solve(self , nums ):
        # write code here
        strs = map(str, nums)
         #根据拼接后的结果判断谁应该放在前面
        def cmp(a, b):
            if a + b == b + a:
                return 0
            elif a + b > b + a:
                return 1
            else:
                return -1

        strs = sorted(strs, key=functools.cmp_to_key(cmp), reverse=True)
        return ''.join(strs) if strs[0]!='0' else '0'
复制代码

原创不易,如果喜欢,给个三连吧。

猜你喜欢

转载自juejin.im/post/7031787649610448933