【数字排列】小明负责公司年会,想出一个趣味游戏: 屏幕给出1~9中任意4个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第N位置的数字,其中N为给出的数字中最大的

【问题描述】小明负责公司年会,想出一个趣味游戏: 屏幕给出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))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值