leetcode之Largest Number

本来看题目感觉是一个很简单的问题,觉得从第一位数最大的开始排序就好了,正好转换成字符串排序就ok了,结果遇到了1和10这种应该是110最大而不是101最大。又开始修改,用正则把后面的0全去掉,比较剩下的值,1和10就ok了,但是12和121的问题又出来了,应该是12121,而不是12112。重新研究下后一种情况,发现可以包括前一种情况。于是自己写了cmp函数,直接排序。写的不是太好。代码如下:

#coding=utf-8
def largestNumber(nums):
	"""
	:type nums: List[int]
	:rtype: str
	"""
	for i in range(len(nums)):
		nums[i] = str(nums[i])
	if nums == []:
		return '0'
	def sortlist(a, b):
		if len(a) > len(b):
			#比较开始的几位
			for i in range(0, len(b)):
				if int(a[i]) > int(b[i]):
					return -1
				if int(a[i]) < int(b[i]):
					return 1
			else:
				#比较中间的几位
				gap = len(a) - len(b)
				for i in range(gap):
					if a[i + len(b)] > a[i]:
						return -1
					if a[i + len(b)] < a[i]:
						return 1
				else:
					# 比较最后的几位
					for i in range(len(b)):
						if int(b[i]) < int(a[i + gap]):
							return 1
						if int(b[i]) > int(a[i + gap]):
							return -1
					else:
						return 1
		if len(a) < len(b):
			#比较开始的几位
			for i in range(0, len(a)):
				if int(a[i]) > int(b[i]):
					return -1
				if int(a[i]) < int(b[i]):
					return 1
			else:
				#比较中间的几位
				gap = len(b) - len(a)
				for i in range(gap):
					if b[i + len(a)] > b[i]:
						return 1
					if b[i + len(a)] < b[i]:
						return -1
				else:
					# 比较最后的几位
					for i in range(len(a)):
						if int(a[i]) < int(b[i + gap]):
							return -1
						if int(a[i]) > int(b[i + gap]):
							return 1
					else:
						return 1
		if len(a) == len(b):
			for i in range(0, len(a)):
				if int(a[i]) > int(b[i]):
					return -1
				if int(a[i]) < int(b[i]):
					return 1
			else:
				return 1
	nums = sorted(nums, cmp = lambda x, y:sortlist(x, y))
	result = ''.join(nums)
	#全是0的情况
	if int(result) == 0:
		return '0'
	return result

print largestNumber([0,0,0,0,0])


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值