zoukankan      html  css  js  c++  java
  • [编程题] nk:[约瑟夫问题(孩子们的游戏-圈内最终剩余的人的编号

    [编程题] nk:约瑟夫问题(孩子们的游戏-圈内最终剩余的人的编号)

    image-20200728195456076

    输入输出

    说明:

    思路

    案例图解:我们以输入n=5,m=3为例:

    image-20200728201703682

    解释:

    image-20200728201734567

    一开始自己错的地方是在如下,while退出条件的地方,错写为dummy.next!=head为退出条件,其实我们本质是要检测圈中剩下一个节点,也就是dummy的next还是dummy我们就退出!

    Java代码

    public class Solution {
        //思路:模拟循环链表的方法
        public static int LastRemaining_Solution(int n, int m) {
            //极端条件
            if (n <= 0) {
                return -1;
            }
            //步骤1:创建一个由n个同学组成的循环链表
            Node head = new Node(0);
            Node cur = head;
            for (int i = 1; i < n; i++) {
                cur.next = new Node(i);
                cur = cur.next;
            }
            //把链表的首尾相连
            cur.next = head;
    
            Node dummy = head;
            int k = 0;
            Node pre = new Node(-1);
            pre.next = dummy;
            while (dummy.next!=dummy){  //这里判断是否是最后一个节点的中止条件是dummy.next!=dummy,而不是dummy.next!=head;
                if(k++ == m-1){
                    pre.next = dummy.next;
                    dummy = dummy.next;
                    k=0;
                }else{
                    pre = dummy;
                    dummy = dummy.next;
                }
            }
            return dummy.val;
    
        }
    }
    
    class Node{
        int val;
        Node next;
        public Node(int val){
            this.val = val;
        }
    }
    
  • 相关阅读:
    自我介绍
    秋季学期总结
    第七周编程总结
    第六周作业
    第五周编程总结
    第四周编程总结
    第三周作业
    第二周作业
    抓老鼠啊~亏了还是赚了
    币值转换
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13393626.html
Copyright © 2011-2022 走看看