难度指数:⭐⭐⭐⭐
通用一般算法:
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
普遍的算法:
- 首先全排列,挑选最小的特定个数字(K=3);
- 然后进行全排列,即两两组合比较得到的数字的大小,确定最终的排列顺序。
弊端:设定挑选的数字比较多时(远远大于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