前言
仅记录学习笔记,如有错误欢迎指正。
题目
每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让 n 个小朋友们围成一个大圈,小朋友们的编号是0~n-1。然后,随机指定一个数 m ,让编号为0的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0… m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客礼品,请你试着想下,哪个小朋友会得到这份礼品呢?
示例:
-
输入:5,3
-
输出: 3
-
输入:2,3
-
输出: 1
-
说明:
有2个小朋友编号为0,1,第一次报数报到3的是0号小朋友,0号小朋友出圈,1号小朋友得到礼物
解法
构造循环链表 删除节点 找出最后一个数。public class Solution {
class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
public int LastRemaining_Solution(int n, int m) {
ListNode node = new ListNode(0);
ListNode head = node;
//创建一个循环链表
for(int i = 1 ;i < n;i++){
node.next = new ListNode(i);
node = node.next;
if(i == n-1){
node.next = head;
}
}
//记录删除后的起始位
ListNode start = head;
//删除n-1个数
while(n-- != 1){
//删除第m位 找到删除的节点
ListNode delNode = null;
ListNode delPreNode = null;
for(int i = 1 ;i < m ;i++ ){
delPreNode = start;
delNode = start.next;
start = start.next;
}
delPreNode.next = delNode.next;
start = delPreNode.next;
if(n == 2){
return m%2 == 0 ? start.val : start.next.val;
}
}
return -1;
}
}