【2682. 找出转圈游戏输家】

文章介绍了一种通过C++模拟的方法来解决环形传球游戏中,哪些朋友会成为输家的问题。涉及游戏规则、动态追踪和空间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:力扣(LeetCode)

描述:

n 个朋友在玩游戏。这些朋友坐成一个圈,按 顺时针方向1n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i + 1) 个朋友的位置(1 <= i < n),而从第 n 个朋友的位置开始顺时针移动 1 步会回到第 1 个朋友的位置。

游戏规则如下:

1 个朋友接球。

  • 接着,第 1 个朋友将球传给距离他顺时针方向 k 步的朋友。
  • 然后,接球的朋友应该把球传给距离他顺时针方向 2 * k 步的朋友。
  • 接着,接球的朋友应该把球传给距离他顺时针方向 3 * k 步的朋友,以此类推。

换句话说,在第 i 轮中持有球的那位朋友需要将球传递给距离他顺时针方向 i * k 步的朋友。

当某个朋友第 2 次接到球时,游戏结束。

在整场游戏中没有接到过球的朋友是 输家

给你参与游戏的朋友数量 n 和一个整数 k ,请按升序排列返回包含所有输家编号的数组 answer 作为答案。

示例 1:

输入:n = 5, k = 2
输出:[4,5]
解释:以下为游戏进行情况:
1)第 1 个朋友接球,第 1 个朋友将球传给距离他顺时针方向 2 步的玩家 —— 第 3 个朋友。
2)第 3 个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 2 个朋友。
3)第 2 个朋友将球传给距离他顺时针方向 6 步的玩家 —— 第 3 个朋友。
4)第 3 个朋友接到两次球,游戏结束。

示例 2:

输入:n = 4, k = 4
输出:[2,3,4]
解释:以下为游戏进行情况:
1)第 1 个朋友接球,第 1 个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 1 个朋友。
2)第 1 个朋友接到两次球,游戏结束。

提示:

  • 1 <= k <= n <= 50

方法:直接模拟

思路与算法

根据题意可以知道总共有 n 个位置,由于起始编号为 1,第 i 个朋友的位置顺时针移动 1 步会到达第 (i + 1) mod n + 1 个朋友的位置。

游戏规则如下: 从第 1 个位置开始传球。

  • 接着,第 1 个朋友将球传给距离他顺时针方向 k 步的朋友。
  • 然后,接球的朋友应该把球传给距离他顺时针方向 2k 步的朋友。
  • 接着,接球的朋友应该把球传给距离他顺时针方向 3k 步的朋友,以此类推。

换句话说,在第 iii 轮中持有球的那位朋友将球传递给距离他顺时针方向 i × k 步的朋友,假设在第 i 轮中持有球的朋友位置为 x,则第 i + 1 轮持有球的朋友位置为 (x + i × k)  mod  n + 1。当某个位置第 2 次接到球时,游戏结束,在整场游戏中没有接到过球的朋友是输家。

我们根据题意直接模拟即可,为了方便计算,设第 1 个小朋友的起始位置为 0,则从 0 开始进行传递,同时用 visit 来标记每个位置是否被访问过,假设当前的位置为 j,则第 i 次传递后球的位置处于 (j + i × k)  mod  n ,此时将所有访问过的位置标记即可,直到当前位置 j 已经被遍历过则直接结束,然后依次遍历找到未被访问的位置返回即可。

代码:

class Solution {
public:
    vector<int> circularGameLosers(int n, int k) {
        vector<bool> visit(n, false);
        for (int i = k, j = 0; !visit[j]; i += k) {
            visit[j] = true;
            j = (j + i) % n;
        }
        vector<int> ans;
        for (int i = 0; i < n; i++) {
            if (!visit[i]) {
                ans.emplace_back(i + 1);
            }
        }
        return ans;
    }
};

时间 12ms 击败 37.81%使用 C++ 的用户
内存 8.07mb 击败 89.84%使用 C++ 的用户
复杂度分析

  • 时间复杂度:O(n),其中 n 为给定的数字。一共有 n 个位置,由于每个位置最多只会被访问一次,因此时间复杂度为 O(n)。
  • 空间复杂度:O(n),其中 n 为给定的数字。一共有 n 个位置,需要记录每个位置是否被访问过,因此空间复杂度为 O(n)。
    author:力扣官方题解
table.reload 转圈通常是指在使用某个表格组件的 reload 方法时,该表格会显示一个加载状态的转圈图标,以提示用户当前正在加载数据。根据引用中的代码示例,可以看到该示例中使用了 pinia 库的 defineStore 方法来定义了一个名为 taskStore 的数据仓库。在该数据仓库中,有一个名为 getTask 的异步方法,用于获取任务数据并更新表格的数据和高度。当调用该方法时,如果返回的响应状态码为 200,表示成功获取到了任务数据,之后会根据数据的行数计算出表格的高度,并更新表格的数据和任务数量。如果返回的状态码不为 200,则会弹出一个警告消息。因此,根据这个代码逻辑,可以推测当调用 table.reload 方法时,可能会触发 getTask 方法,从而引起表格显示加载状态的转圈图标。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [js刷新页面location.reload()用法详解](https://download.csdn.net/download/weixin_38720256/12930831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue3+node.js 封装MongoDB find,传入query对象即可实现多条件、日期时间范围查询](https://blog.csdn.net/z_y_z_g/article/details/129759750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [antd tree 懒加载+局部刷新](https://blog.csdn.net/hfhwfw161226/article/details/127107827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千北@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值