题目:
个人总结
1823. 找出游戏的获胜者 题目:
共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。
游戏遵循如下规则:
从第 1 名小伙伴所在位置 开始 。
沿着顺时针方向数 k 名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。
你数到的最后一名小伙伴需要离开圈子,并视作输掉游戏。
如果圈子中仍然有不止一名小伙伴,从刚刚输掉的小伙伴的 顺时针下一位 小伙伴 开始,回到步骤 2 继续执行。
否则,圈子中最后一名小伙伴赢得游戏。
给你参与游戏的小伙伴总数 n ,和一个整数 k ,返回游戏的获胜者。(题目有图解释)
这道题简单的说就是报数,从1开始喊,谁喊道k谁出局,最后剩下一个人获胜。
这道题最简单的是使用队列,代码最简单的是使用数学证明:约瑟夫环(这个证明还是需要理解理解滴)
最主要还是出现了队列(需要另外巩固的专题,平时开发用的比较少)
用队列整道题还是简单很多的,最主要是对队列的掌握
Java 实例 – 队列(Queue)用法 | 菜鸟教程Java 实例 - 队列(Queue)用法 Java 实例 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。 LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。 以下实例演示了队列(Queue)的用法: Main.java 文件 [mycode3 type='java'] import java.util.LinkedL..https://www.runoob.com/java/data-queue.html约瑟夫是一个有效率的问题,但是觉得刷算法还是主要通过算法去掌握相关的数据结构和一些包的使用,效率性能可以考虑,但是前提还是先用逻辑性没有那么强的数据结构实现了再考虑进一步升级优化。
这里需要掌握队列的几个点:
1. 如何构建一个队列
2. 如何遍历队列
3. 如何出队
class Solution {
public int findTheWinner(int n, int k) {
Queue<Integer> queue = new LinkedList<Integer>();
for(int i = 1; i <= n; i ++){
queue.offer(i);
}
while(queue.size() > 1){
for(int i = 1; i < k ; i++){
queue.offer(queue.poll());
}
queue.poll();
}
return queue.poll();
}
}