圆圈中最后剩下的数

前言

仅记录学习笔记,如有错误欢迎指正。

题目

每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让 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;
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值