首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们!
然后今天群里突然有人提出了题目的这个问题:
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

冥思苦想了半天(好吧,我承认我就审了审题目就百度了。。),然后查到了几种算法吧,但是我不知道是因为我只会java还是真的有的人的思路比较广泛,跳跃,所以看起来略复杂啊。

然后有仔细看了半天,稍微好一点勉强看懂了,但是我觉得还是不简单,而且是思维上的绕圈。

但是我还把我看过的感觉上挺全的(主要是内容很多)的链接在此粘一下,有兴趣的同学可以去看看:https://blog.csdn.net/weixin_38214171/article/details/80352921

然后继续说我又在网上找了找,果然找到一种我觉得很简单易懂而且很方便的解决方法,然后我又在其基础上做了解释说明,下面是解法:

 package test;

 import java.util.ArrayList;
import java.util.List; /**
* 约瑟夫环问题的解决
* @author sijia
*
*/
public class Demo1 { public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
list.add(9);
list.add(10);
list.add(11);
list.add(12);
list.add(13);
list.add(14);
list.add(15);
list.add(16); //思路是遍历数组,隔两个删除一个元素,直到只剩下一个元素。如果到了数组末尾则跳转开头
int i=0;
while(list.size()!=1) {
//遍历到了最后一个元素,i+2是跳转到正数第二个元素
if(i>=list.size()-1) {
i=-1;
}
//遍历到了倒数第二个元素,i+2是跳转到第一个元素
if(i>=list.size()-2) {
i=-2;
}
//以上完成了数组据末尾跳转到数组开头 i=i+2;
/**
* 删除元素
* 这里不理解的可以做个带入。第一次删除0+2,也就是把下标为2的元素删除了。第二次继续,走到这里
* i=2+2变成了4.为什么这次删除下标为4的?因为之前把下标为2的删除后,后面的元素依次前移了。
* 原下标3的现在下标为2.同理,原下标为5的现在下标为4.
* 如此:3,4,后面原下标5现下标4的元素删除。符合了题目的逻辑。
* i每次都加2,是因为上一轮删除了一个元素,整个下标都前移了。所以才会+2代表隔了两个删除一个
* 同样大家可以考虑一下这道题的变换:比如题目变成隔5个删除一个,也就是报数1-6,数到6的出局要怎么写?
*
*/
list.remove(i); }
/**
* 最后打印出来的就是剩下的那个元素,因为我这里取巧,将下标和元素的值对应了,所以我们不仅可以看出元素的值
* 还可以看元素原来的下标。如果不这么做可以在一开始就复制一份list,然后用最后剩下来的值去反推,再不济还能不移除而是用别的方法标记出局。这样要改动的比较大
* 这个 数值与数组list的总元素数,也就是题目中的N息息相关,我反正试了多次。
*/
System.out.print(list.get(0)); } }

至此,问题解决,然后文中我留了两个问题:

1.这个人数n和排除的数m之间是有一定关联关系的,但是我这个数学渣有点没耐心一遍遍测试或者思考了,所以作为一个遗留问题吧。

2.我文中说的,这个方法是实现N个人数到3退出的代码。但是如果题目是N个人数到5退出呢?又该怎么写?反正我目前是有思路了,有意的可以私信我探讨哦~~

全文手打不易,如果稍微帮到你了,请点个喜欢点个关注支持一下~~~~~也祝大家工作顺顺利利!

约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。的更多相关文章

  1. 37 有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位.

    题目:有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位. public class _037NumberOff { public st ...

  2. 20190121-n个人围成一圈,凡报到3的人退出圈子,最后留下的是原来第几号的那位

    1. 报数问题:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位 思路:此题主要问题在于但凡报到3的人退出圈子,而报数的号码与圈子的 ...

  3. 【转】约瑟夫环算法---------题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.

    提示:用环形链表实现 对于这个题目其实就是用c语言的循环链表实现一个约瑟夫环.我们可以定义一个循环链表,将这n个人加入到链表中,然后定义三个节点指针在链表上循环,移动跨度为3,利用链表的循环功能每次删 ...

  4. 代码实现:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

    import java.util.ArrayList; import java.util.List; import java.util.Scanner; //有n个人围成一圈,顺序排号.从第一个人开始 ...

  5. java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

    1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 ...

  6. 报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

    n = int(input("请输入人数:")) list_p = list(range(1,n+1)) #将所有人放在一个数字里面 count = 0 #设置一个变量,用户计算报 ...

  7. 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

    先写我的思路,没有用指针的做法.如果你用的是VC,把第六行去掉. #include<stdio.h> #include<stdlib.h> int main() { setvb ...

  8. 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

    #include <iostream> using namespace std; int main() { int i,j,n,m,k,*p,num[100];k=m=0;   cin&g ...

  9. 用Matlab完成:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

    程序思路: (1)一圈人循环报数,报数报到3的人,将其置为0,表示被淘汰: (2)那么在接下去的循环中,被淘汰的人不参与报数: (3)直到仅有1人没被淘汰,并显示出他之前的编号. 程序实现如下: cl ...

随机推荐

  1. python中的*args和** kwargs区别

    写了几个月的oython了总感觉除了if else for while什么都不太会,看了架构师的代码参数传递总是使用*args,**kwargs,一直搞不太明白,只是模仿着用,最近有时间想系统的学习一 ...

  2. 二进制文件安装安装flannel

    二进制文件安装安装flannel overlay网络简介 覆盖网络就是应用层网络,它是面向应用层的,不考虑或很少考虑网络层,物理层的问题. 详细说来,覆盖网络是指建立在另一个网络上的网络.该网络中的结 ...

  3. 关于FFT分析音频的学习

    本文部分知识从以下文章学习: https://zhuanlan.zhihu.com/p/19763358 傅里叶变换的知识 https://www.cnblogs.com/RabbitHu/p/FFT ...

  4. Linux基础进程管理

    一.进程 了解如进程的: • PID,PPID • 当前的进程状态 • 内存的分配情况 • CPU和已花费的实际时间 • 用户UID,他决定进程的特权 (一).静态查看进程 # ps axu | le ...

  5. Dialog 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  6. Flask+APScheduler定时任务

    1.安装依赖 pip install flask_apscheduler 2.使用定时任务 ```python from flask import Flask from flask_apschedul ...

  7. maven 打包并导出 lib 第三方jar

    一. maven 导出lib 包 执行命令 mvn dependency:copy-dependencies -DoutputDirectory=target/lib 或者在 eclipse 中执行, ...

  8. 单元测试python unittest

    记录自己学习单元测试框架的一篇博客 菜鸟的学习之路比较艰辛到处找资料一把辛酸泪啊 1.首先是创建一个类里面设计一些简单的函数方便写用例: 原谅我蹩脚的英文直接用拼音命名了 : 2.接着就是创建用例文件 ...

  9. 【Java例题】8.1手工编写加法器的可视化程序

    1. 手工编写加法器的可视化程序. 一个Frame窗体容器,布局为null,三个TextField组件,一个Button组件. Button组件上添加ActionEvent事件监听器ActionLis ...

  10. 6、高级的数组的复制(test4.java)

    这里指的高级,并不是过么高大上,而是说我们可以调用系统函数,直接对数组进行复制,并且这个函数的强大并不止局限于,对数组的复制,而且可以对数组进行截取,在指定位置插入或删除某个元素. 本篇只介绍数组的复 ...