前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >给出一组非负整数,重新排序组成最大的数

给出一组非负整数,重新排序组成最大的数

原创
作者头像
hooyes
修改2018-04-11 23:58:00
2.1K9
修改2018-04-11 23:58:00
举报
文章被收录于专栏:技术杂谈

文章为原创首发地址:https://hooyes.net/p/python-largest-number

描述

给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。

代码语言:txt
复制
例
给出 [1, 20, 23, 4, 8],返回组合最大的整数应为 8423201
给出 [1, 201, 20, 9, 8],返回组合最大的整数应为 98202011
给出 [1, 203, 20, 9, 8],返回组合最大的整数应为 98203201

算法

我给简单好理解的两个排序算法:

算法1:

先把对比的数字转成字符,拼接后再转成整数进行大小对比,即 int(a+b) 与 int(b+a) 进行降序排列。代码1。

算法2:

每个元素逐个字符进行对比。代码2。

代码1

代码语言:txt
复制
# Python2

class Solution:
    def largestNumber(self, nums):
        scmp = lambda a,b: int(b+a)-int(a+b)
        res = ''.join(sorted(map(str, nums), cmp=scmp)).lstrip('0')
        return res or '0'
代码语言:txt
复制
# Python3 

from functools import cmp_to_key
class Solution:
    def largestNumber(self, nums):
        key = cmp_to_key(lambda a,b: int(b+a)-int(a+b))
        res = ''.join(sorted(map(str, nums), key=key)).lstrip('0')
        return res or '0'

代码2

代码语言:txt
复制
# Python2 

class Solution:
    def largestNumber(self,nums):
        def cxx(x,y):
    		i = 0 
    		sx= str(x)
    		sy= str(y)
    		while i< len(str(min(x,y))):
    			if sx[i] > sy[i]:
    				return 1
    			elif sx[i] < sy[i]:
    				return -1
    			elif x == y:
    			    return 0
    			i+=1
    		if i == len(sx):
    			return -1 if sy[i]>sy[0] else 1
    		if i == len(sy):
    			return 1 if sx[i]>sx[0] else -1
    	nx = sorted(nums,cmp=lambda x,y:cxx(x,y),reverse=True)        
    	res = ''.join(map(str, nx)).lstrip('0')
    	return res or '0'     

测试

代码语言:txt
复制
t = Solution()
print(t.largestNumber([1, 20, 23, 4, 8]))
// 8423201

以上代码已放到Hooyes的Github上开源,欢迎Fork或提建议。

largest-number.py

运行 python largest-number.py 即可以测试。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述
  • 算法
  • 代码1
  • 代码2
  • 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档