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])))

results matching ""

    No results matching ""