找出输家(笔记)

文章讲述了在一个n个朋友围成的顺时针转圈游戏中,每个朋友按规则传递球,当某人第二次接到球时游戏结束。通过模拟并使用boolean数组记录访问情况,找出从未接过球的朋友,即确定输家。给出了一段Java代码实现Solution类的解决方案。

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

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

游戏规则如下:

第 1 个朋友接球。

接着,第 1 个朋友将球传给距离他顺时针方向 k 步的朋友。
然后,接球的朋友应该把球传给距离他顺时针方向 2 * k 步的朋友。
接着,接球的朋友应该把球传给距离他顺时针方向 3 * k 步的朋友,以此类推。
换句话说,在第 i 轮中持有球的那位朋友需要将球传递给距离他顺时针方向 i * k 步的朋友。

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

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

解题思路:

​ 模拟场景,一共n个位置,我们用一个boolean数组记录该位置是否被访问过

​ 从j=0位置开始,i = k (步长) 每次循环 i + =k , (下一个位置) j = (j+i)%n; 当有人第二次拿到球结束;

代码实现

class Solution {
    public int[] circularGameLosers(int n, int k) {
            boolean[] visit = new boolean[n];//记录谁拿过球
            for(int i = k,j=0;!visit[j];i+=k){//再次拿到球结束
                visit[j] = true;
                j= (j+i)%n;
            }
            List<Integer> list = new ArrayList<>();
            for(int i=0;i<n;i++ ){
                if(!visit[i]){
                    list.add(i+1);
                }
            }
            int[] ans = new int[list.size()];
            for(int i=0;i<list.size();i++){
                ans[i]=list.get(i);
            }

            return ans;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值