题目:
共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第
(i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。
游戏遵循如下规则:
- 从第 1 名小伙伴所在位置 开始 。
- 沿着顺时针方向数 k 名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。
- 你数到的最后一名小伙伴需要离开圈子,并视作输掉游戏。
- 如果圈子中仍然有不止一名小伙伴,从刚刚输掉的小伙伴的 顺时针下一位 小伙伴 开始,回到步骤 2 继续执行。
- 否则,圈子中最后一名小伙伴赢得游戏。
给你参与游戏的小伙伴总数 n ,和一个整数 k ,返回游戏的获胜者。
示例一:
示例二:
输入:n = 6, k = 5 输出:1 解释:小伙伴离开圈子的顺序:5、4、6、2、3 。小伙伴 1 是游戏的获胜者。
方法一:使用数组
思路:
1、定义长度为n的数组arr【n】
2、定义一个cur指针,不停移动来指向当前元素
3、定义count变量来计数指针cur需要移动的次数
4、指针cur在变化的时候,随后紧接cur对数组取余,防止越界
5、如果直接对数组长度n取余,则永远取不到数组最后一个元素,所以对数组(n+1)取余;
代码如下:(只包含一个函数)
def findTheWinner(self, n: int, k: int) -> int:
#定义数组
arr = []
for i in range(n+1):
arr.append(i)
arr[0] = -1
# print(arr)
cur = 1
#一直循环直到数组中只剩下一个元素,所以循环n-1次:(0~n-2)
for j in range(n-1):
count = 1
while count < k:
#遇到数组中存的值不是-1的才算数
if arr[cur] != -1:
count += 1
cur += 1
cur %= n+1
#直到找到当前指针所指的内容不是-1的时候,当前指针所指的内容才赋值为-1
while arr[cur] == -1:
cur += 1
cur %= n+1
arr[cur] = -1
#在赋值为-1之后继续移动指针,找到下一个
while arr[cur] == -1:
cur += 1
cur %= n+1
# print(arr)
return cur
知识点:
对数组取余,实现循环
方法二:循环链表
思路:
1、建一个Nodes()类:value,next,pre
2、初始化链表
代码如下:
class Node(object):
def __init__(self,value,next,pre):
self.value = value
self.next = next
self.pre = pre
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
head = Node(1, None,None)
p = head
#初始化链表
for i in range(2,n+1):
p.next = Node(i,None,p)
p = p.next
p.next = head
head.pre = p
flag = head
#找到要删除的节点,flag指向
for j in range(n-1):
for i in range(k-1):
flag = flag.next
#删除一个节点
flag.pre.next = flag.next
flag.next.pre = flag.pre
flag = flag.next
return flag.value
知识点:
学会了怎么建一个结点,要写在__init__方法里面