您的位置:首页 > 职场人生

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

2021-11-18 14:16 573 查看

问题描述

179. 最大数

给定一组非负整数

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

示例:

输入:nums = [10,2]

输出:"210"

分析问题

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

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

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

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

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

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

我们来看一下,这种排序方式对于输入数组没有相同数字开头的时候是有效的,比如[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'

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: