翻硬币游戏
字节面试时遇到的一道题,网上引起讨论的比较少,随手记录一下。
题目描述
有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)