字节面试题
题目: n个人,从1 开始报数, 报到 m 的人会被删掉, 然后从 1 继续报数 最后删除的人是?
以 n=5 m=2为例 1 2 3 4 5 第一次删除 2 4 第二次删除 1 5 返回3
num 循环计数
circle 为一个队列,队列的第一个元素一直为当前计数 num 所对应的元素
伪代码:
while 队列长度不为1:
如果 num 等于 m:
将 第一个元素 pop掉
将 num 置 1
如果 num 不等于 m:
将 第一个元素 pop出来 append 队列的尾部
num 加 1
返回 队列中的第一个元素
def remain(n, m):
circle = [i for i in range(1, n+1)] # 相当于队列
num = 1 # 计第一个数
while len(circle) != 1:
if num == m:
circle.pop(0)
num = 1 # pop完之后重新计数
else:
circle.append(circle.pop(0)) # 如果该数没有被删除 则加入 尾部
num += 1 # num继续计数
print(circle[0])
remain(5, 2)