数组组成最小数字python

 难度指数:⭐⭐⭐⭐

通用一般算法:

把数组排列成最小的数-python

def PrintMinNumber(numbers):
    def camp(a,b):
        if int(str(a)+str(b))<int(str(b)+str(a)):
            return -1
        elif int(str(a)+str(b))>int(str(b)+str(a)):
            return 1
        else:
            return 0
    tmpNumbers = sorted(numbers,key=functools.cmp_to_key(camp))
    return int(''.join(str(i) for i in tmpNumbers))

创新算法

idea

普遍的算法

  1. 首先全排列,挑选最小的特定个数字(K=3);
  2. 然后进行全排列,即两两组合比较得到的数字的大小,确定最终的排列顺序。

弊端:设定挑选的数字比较多时(远远大于3),全排列比较复杂。
wonder: K个数字如何排序可以使得得到的最终数字最小?
idea

  • K个数字按最大数字的长度通过重复自身进行补齐。所有数字高位对齐,空缺位对各数字本身进行重复。各数字从高位到低位进行补齐。
  • 而后对补齐后的数字进行逆(正)向排序,并还原到将数字对齐之前的原数字,即可得到最小(大)数字。

代码实现

def PrintMinNumber0(nums):
    l=len(str(max(nums)))
    temp=sorted(nums,key=lambda i:int((str(i)*l)[:l]))
    return ''.join(str(i) for i in temp)

对比验证

import functools,random
def PrintMinNumber(numbers):
    def camp(a,b):
        if int(str(a)+str(b))<int(str(b)+str(a)):
            return -1
        elif int(str(a)+str(b))>int(str(b)+str(a)):
            return 1
        else:
            return 0
    tmpNumbers = sorted(numbers,key=functools.cmp_to_key(camp))
    return int(''.join(str(i) for i in tmpNumbers))

def PrintMinNumber0(nums):
    l=len(str(max(nums)))
    temp=sorted(nums,key=lambda i:int((str(i)*l)[:l]))
    return ''.join(str(i) for i in temp)

flag_test=10
while flag_test:
    nums=[random.randint(1,int(1e4)) for _ in range(random.randint(3,int(1e4)))]
    K=3
    nums=sorted(nums)[:K]
    print(PrintMinNumber(nums))
    print(PrintMinNumber0(nums))
    flag_test-=1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值