翻硬币游戏

字节面试时遇到的一道题,网上引起讨论的比较少,随手记录一下。

题目描述

有1000枚硬币正面朝上依次排开,初始编号为1~1000,游戏开始,凡是奇数编号将其翻面,一轮结束后,所有正面朝上的硬币重新从1开始编号继续游戏,请通过代码计算出当只剩一枚正面朝上的硬币,其初始编号。

解题思路

暴力法:建立一个key映射多个value值的字典,以初始序号为key,value1为每一轮编号,value2为是否被翻。

from collections import defaultdict

dict = defaultdict(list)
count_dict = defaultdict(int)
key = []
for i in range(1, 1001):
    key.append(i)

# 初始赋值
for kw in key:
    dict[kw].append(int(kw))
    # True表示正面
    if int(kw) % 2 == 0:
        dict[kw].append(True)
    else:
        dict[kw].append(False)

remain = 500
while remain > 3:
    flag = 0
    for kw in key:
        if dict[kw][1] == True:
            flag += 1
            dict[kw][0] = flag
            if flag % 2 == 0:
                dict[kw][1] = True
            else:
                dict[kw][1] = False
    remain = flag
    # print(remain)

for kw in key:
    if dict[kw][1] == True:
        print(kw)
# print(dict)
posted @ 2022-08-12 17:06  IcyYs  阅读(107)  评论(0编辑  收藏  举报