美文网首页
java面试题之约瑟夫环问题求解策略《四》

java面试题之约瑟夫环问题求解策略《四》

作者: 铭戈栈 | 来源:发表于2018-08-30 23:38 被阅读0次
import java.util.ArrayList;

/**
 * 约瑟夫环 问题
 * 获取幸运数字
 * 思路:
 * ①集合数组的
 * ②递归
 */
public class josephRing03 {
    public static void main(String[] args){
        System.out.println("第一种方法:集合法");
        System.out.println(getLuckNum01(10));
        System.out.println("第二种方法:递归法");
        System.out.println(getLuckNum02(10,3,8));
        System.out.println(getLuckNum02(9,3,7));
        System.out.println(getLuckNum02(8,3,6));
        System.out.println(getLuckNum02(7,3,5));
        System.out.println(getLuckNum02(6,3,4));
        System.out.println(getLuckNum02(5,3,3));
        System.out.println(getLuckNum02(4,3,2));
        System.out.println("第三种方法:公式法");//本质也是递归
        System.out.println(getlive(10, 3));
        System.out.println(getlive( 9, 3));
        System.out.println(getlive( 8 , 3));
        System.out.println("第三.001种方法:公式形象记忆法");//本质也是递归
        System.out.println(getLuckNum(10, 3));
        System.out.println(getLuckNum(9, 3));
        System.out.println(getLuckNum(8, 3));


    }

    //①数组集合法
    public static int getLuckNum01(int num) {
        //1.定义一个集合,并且添加人进去,10环就add十个人进去,100人环就add100个人进去
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= num; i++) {
            list.add(i);
        }
        //2.定义一个指针,区别于下面的i,这个count是直接跟人头对接的,所以要从1开始。
        int count = 1;
        //3.遍历所有元素,一直“杀死”人直到只剩下最后一个人即list.size()!=1时都要继续遍历
       /* System.out.println(list.size());*/
        for (int i=0;list.size()!=1;i++){
            //4.如果已经遍历到最后一个人了,则重新开始,i重新等于0,又一个新环来进行“杀人”游戏
            //注:这里要设置判断条件为list.size(),而不是list.size()-1是有原因的
            //因为i作为下标一直遍历增加,直到最后一个下标,都是可以杀人的,也就是说还可以进行下面的if判断以及count++
            //所以,直到i增加到list.size时,已经可以说是下标越界了,此时就要使得要越界的这个i变成0,重新开始新的“i生”(人生~哈哈哈)
            if(i==list.size()){
                i =0;
            }
            //5.当指针的对3求余为0时,去除掉list的这个元素。
            //注:由于少了一个数,后面的数会补上前来,下标不变的话,i又必须得-1,才能不会错过当前的人
             if(count%3 == 0){
                list.remove(i--);
            }
            //6.count继续累加
            count++;
        }
        return list.get(0);

    }
    //②递归法(大神法)
    public static int getLuckNum02(int sum,int value,int n) {
        if( n ==1){
            return (sum+value-1)%sum;
        }
        else{
            return (getLuckNum02(sum-1, value, n-1)+value)%sum;
        }
    }
    //3.公式法
    public static int getlive(int n,int m){
        if(n == 1){return 1;}
        return (getlive(n-1,m)+m-1)%n+1;//背下来就可以了
    }
    //3.01形象记忆公式法
    public static int getLuckNum(int sumMan,int jiange){
        if(sumMan == 1) {
            return 1;
        }
        else{
            return (getLuckNum(sumMan-1,jiange)+jiange-1)%sumMan+1;//背下来就可以了
        }

    }



}

总结:
①直接背公式。
②理解指针指向。

欢迎访问个人搭建的博客:ympeng.top

相关文章

  • java面试题之约瑟夫环问题求解策略《四》

    总结:①直接背公式。②理解指针指向。 欢迎访问个人搭建的博客:ympeng.top

  • [java]约瑟夫环问题

    约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁?

  • 约瑟夫问题求解

    一、问题描述 约瑟夫问题是:有 n 只猴子,按顺时针方向围成一圈选大王(编号为 1~n),从第 1 号开始报数,一...

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 数据结构与算法整理

    (1)链表的技巧 快慢指针(找环,环入口,环长度) 双指针(倒数K个节点) 合并链表(递归求解) 约瑟夫环(环形链...

  • 约瑟夫环问题

    0~n-1个数排成环,每次从中删除第m个数字后,问最后剩下的数字是多少 思路:使用链表模拟环状结构,到达尾部时使其...

  • 约瑟夫环问题

    思路 递推,f(n)与f(n-1)的关系,已经f(1)已知,O(n)的复杂度求出结果。f(n) = (f(n-1)...

  • 约瑟夫环问题

    约瑟夫环:30个人(15个教徒和15个非教徒)坐船出海 船坏 需要把15个人扔到海里 其他人才能幸存 围成一圈从某...

  • 约瑟夫环问题

    参考文章 约瑟夫环之二(用递归的思想解决Josephus问题) 解释 解法 初始情况: 0, 1, 2 ........

  • 约瑟夫环问题

    问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编...

网友评论

      本文标题:java面试题之约瑟夫环问题求解策略《四》

      本文链接:https://www.haomeiwen.com/subject/vnsjwftx.html