【问题描述】小明负责公司年会,想出一个趣味游戏: 屏幕给出1~9中任意4个不重复的数字,
大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第N位置的数字,其中N为给出的数字中最大的(如果不到 这么多个数字则给出最后一个即可)。
注意: 1)2可以当做5来使用,5也可以当做2来使用进行数字拼接,且屏幕不能同时给出2和5;
2)6可以当做9来使用,9也可以当做6来使用进行数字拼接,且屏幕不能同时给出6和9。
# 使用优先级队列
def number_game(numbers: List[int], length: int) -> int:
"""
:param numbers: 4个随机数字
:param length: 第N的位置
:return:
"""
if len(numbers) != 4:
return 0
replace_num = {
2: 5,
5: 2,
6: 9,
9: 6
}
# 找出所有组合
all_nums = []
for num in numbers:
all_nums.append(num)
if num in replace_num:
all_nums.append(replace_num[num])
p_queue = queue.PriorityQueue() # 用优先级队列模拟小顶堆, 堆顶元素就是目标值
for i in itertools.product(all_nums, all_nums, all_nums, all_nums): # 所有组合
check = set(i)
if len(check) < 4 or (2 in check and 5 in check) or (6 in check and 9 in check): # 去掉有重复数字的组合
continue
new_num = i[0]*1000+i[1]*100+i[2]*10+i[3]
if p_queue.qsize() >= length: # 与堆顶元素比较, 判断是否入堆
heap_top = p_queue.get()
if new_num >= heap_top[1]:
p_queue.put(heap_top)
continue
p_queue.put((-new_num, new_num))
else:
p_queue.put((-new_num, new_num))
return p_queue.get()[1]
if __name__ == '__main__':
print(number_game([1, 2, 3, 6], 19))