面试腾讯遇到这道题也是不容易呀
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'
原创不易,如果喜欢,给个三连吧。
相关文章推荐
- 程序员美团面试挂了,7天后去腾讯面试,见到面试官:遇到熟人了
- 同门腾讯面试遇到的问题
- 腾讯实习生笔试面试总结(1)
- 腾讯实习生笔试面试总结(2)
- 2017腾讯校招面试回忆(成功拿到offer)
- 分享Java面试中遇到的一些经典算法题目
- 备战腾讯面试经历分享,小伙终获Android岗Offer
- 2017-11-7java(3-4年)面试中遇到的面试题
- 腾讯后台开发面试
- Android--面试中遇到的问题总结(四)
- 面试中遇到的算法题分析
- 说一下用浏览器访问www.qq.com的流程(腾讯面试)
- 2016年腾讯实习生面试技术面一面二面
- 软件测试人员面试会遇到哪些灵魂提问?
- 面试也是技术成长的一部分
- 去百度面试遇到的一个流体布局
- [转]腾讯研发类笔试面试试题(C++方向)
- android面试题 不单单为了面试也是一次很好的学习
- 腾讯测试岗位的面试经历
- [腾讯面试] 2015校招腾讯阿里面试经验分享(拿到offer)