Reorder array to construct the minimum number
给定一个整数数组,请将其重新排序,以构造最小值。
注意事项
The result may be very large, so you need to return a string instead of an integer.
样例
给定[3, 32, 321]
,通过将数组重新排序,可构造 6 个可能性数字:
3+32+321=332321
3+321+32=332132
32+3+321=323321
32+321+3=323213
321+3+32=321332
321+32+3=321323
其中,最小值为321323
,所以,将数组重新排序后,该数组变为[321, 32, 3]
这道题实际上是largest number那道题反过来了,不过不同的是题目中没有明确数组中的数的范围,这也就意味着需要考虑0和负数,具体就体现在comparator的实现要考虑一些特殊情况,如对负号的处理,0的处理等等,给几个特殊的test case就知道了
- [0]
- [0, 1]
- [0, 0, 0, 0]
- [-5, 1]
下面是代码
def comparator(A, B):
sign_A = A / abs(A) if A != 0 else 1
sign_B = B / abs(B) if B != 0 else 1
left = int(str(abs(A)) + str(abs(B))) * sign_A * sign_B
right = int(str(abs(B)) + str(abs(A))) * sign_A * sign_B
return cmp(left, right)
class Solution:
# @param {int[]} nums n non-negative integer array
# @return {str} a string
def minNumber(self, nums):
# Write your code here
nums.sort(cmp = comparator)
return str(int(''.join([str(x) for x in nums])))