zoukankan      html  css  js  c++  java
  • 面试题62:圆圈中最后剩下的数字(约瑟夫环问题)

    1 题目描述

      每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

    如果没有小朋友,请返回-1

    2 输入

    m, n

    3 输出

    最后一个数

    4 样例输入

    5,3
    

    5 样例输出

    3
    

    6 求解思路

      基于链表实现,最好用LinkedList,因为涉及到链表节点的删除

    7 Java版本代码如下

    package zr.test;
    import java.util.*;
    
    /**
     * @author ZR
     * @Classname Mian
     * @Description TODO
     * @Date 2020/8/29 10:07
     */
    public class Mian {
    
        public static void main(String[] args) {
            System.out.println(LastRemaining_Solution(5, 3));
        }
    
        public static int LastRemaining_Solution(int n, int m) {
            if (n < 1 || m < 1)
                return -1;
            List<Integer> list = new ArrayList<Integer>();
            // 初始化
            for (int i = 0; i < n; i++)
                list.add(i);
            int start = 0;
            while (list.size() > 1) {
                // 走m步骤
                int step = 1;
                int i = start + 1;
                for (; ; i++) {
                    if (i == list.size())
                        i = 0;
                    step++;
                    if (step == m)
                        break;
                }
                list.remove(i);
                
                if (i == list.size())
                    i = 0;
                start = i;
            }
            return list.get(0);
        }
    }
    
  • 相关阅读:
    Linux常用命令之 查找命令 find —— 细说 -atime,-mtime,-ctime
    centos设置静态ip
    Linux中vim的基本操作
    Linux中/和~的区别
    Linux安装vmtools工具
    关于 [lambda x: x*i for i in range(4)] 理解
    Ubuntu虚拟环境的搭建
    tomcat的中的Apache的apr是个啥东东???
    什么是web资源????
    Handlebars学习第一天
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13585003.html
Copyright © 2011-2022 走看看