剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: “102”
示例 2:
输入: [3,30,34,5,9]
输出: “3033459”
提示:
0 < nums.length <= 100
说明:
输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
class Solution:
def minNumber(self, nums: List[int]) -> str:
for i in range(len(nums)):
index=i
for j in range(i+1,len(nums)):
if self.compare(nums[index],nums[j]):
continue
else:
index=j
nums[i],nums[index]=nums[index],nums[i]
return "".join(map(str,nums))
def compare(self,nums1,nums2):
nums1=str(nums1)
nums2=str(nums2)
index=0
while (index<2*len(nums1))|(index<2*len(nums2)) :
if index<len(nums1):
nums1_index=int(nums1[index])
else:
index1=index%len(nums1)
nums1_index=int(nums1[index1])
if index<len(nums2):
nums2_index=int(nums2[index])
else:
index2=index%len(nums2)
nums2_index=int(nums2[index2])
if nums1_index<nums2_index:
return True
elif nums1_index>nums2_index:
return False
else:
index+=1
return True
class Solution:
def minNumber(self, nums: List[int]) -> str:
def sort_rule(x, y):
a, b = x + y, y + x
if a > b: return 1
elif a < b: return -1
else: return 0
strs = [str(num) for num in nums]
strs.sort(key = functools.cmp_to_key(sort_rule))
return ''.join(strs)