1823.找出游戏的获胜者

题目:

共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第
(i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。

游戏遵循如下规则:

  1. 从第 1 名小伙伴所在位置 开始 。
  2. 沿着顺时针方向数 k 名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。
  3. 你数到的最后一名小伙伴需要离开圈子,并视作输掉游戏。
  4. 如果圈子中仍然有不止一名小伙伴,从刚刚输掉的小伙伴的 顺时针下一位 小伙伴 开始,回到步骤 2 继续执行。
  5. 否则,圈子中最后一名小伙伴赢得游戏。

给你参与游戏的小伙伴总数 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__方法里面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值