本来看题目感觉是一个很简单的问题,觉得从第一位数最大的开始排序就好了,正好转换成字符串排序就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])