问题分析

一,问题描述

500个人围成一圈 ,从第一个人开始数数,第一个人数1 第二个人数2 第三个人数3 ,数到3的人退出圈子,第四个人重新开始数数 ,第四个数1 ,第五个2 ,第六个 3(退出圈子),一直这样数下去,求最后剩余的那个人所在位置。

二,问题详细求解思路

1.面向过程的思想

数组表示500个人围成一个圈 数组有类型 描述该人不在圈子中 boolean[] cicle = new boolean[500] true 表示在圈子中 false 表示不在

数数从数组的下标为0的那个元素开始
count = 0 用来计数

数数的过程 循环的过程 退出循环的条件是圈子中只剩下一个人,cicle数组中只有一个值为true的元素的时候就退出
leftCont = 500 表示数组中还剩余值为true的元素的个数(剩余人的个数)
index = 0;//记录数组的下标

 while(leftCont > 1)if(cicle[index])count ++判断index ++ 之后是否为3if(count == 3)退出圈子cicle[index] = false重新赋值index的值count = 0;leftCont -- index ++//i不能超过数组的长度if(index >= 500)index = 0
2.面向对象封装的思想

人对象 person
           id 表示在圈子的位置
           左边的人对象 left
           右边的人对象 right
圈子对象 cicle
            圈子大小 count = 0
            圈子的第一个人person first
            圈子的最后一个人person last

方法抽象
           圈子要初始化
            new cicle(500)
            方法 加人(person p)
            圈子中已经有人的情况
            count ++
            原来圈子中最后一个人的右边 > 新加人p

新加人p的左边 》 原来圈子中的最后一个人
           新加人p的右边 》 原来圈子中第一个人
           原来圈子中最后一个人 = 新加人p
            如果是一个空圈 count= 0
            圈子中的第一个人 = 新加人p
            圈子中最后一个人 = 新加人p

方法 删除人(person p)
           删除人p左边的人 》 删除人右边的人
           删除人右边的人 》 删除人左边的人
           如果删除的是第一个人
            删除人的右边的人变成了圈子中的第一个人
            如果删除人是最后一个人
           删除人的左边变成了圈子中的最后一个人

java代码实现

一,代码结构

Person类:

用于封装人对象的,主要成员有:1.自身的ID 2.右边的人 3.左边的人。

personCircle类:

用于封装圈对象:主要成员有:1.圈内人数 2.圈内第一个人 3.圈内最后一个人。

Test类:

用于测试程序的类

二,可运行代码

Person类:

package com.kp;
/**
* @author Fiee@filecomment  /*** */public class Person {/*** 人对象*//*** id号*/private int id;/*** 左边的人*/private Person left; /*** 右边的人*/private Person right;/*** @param id* @param left* @param right*/public Person(int id, Person left, Person right) {super();this.id = id;this.left = left;this.right = right;}/*** @param id*/public Person(int id) {super();this.id = id;}/*** @return the id*/public int getId() {return id;}/*** @param id the id to set*/public void setId(int id) {this.id = id;}/*** @return the left*/public Person getLeft() {return left;}/*** @param left the left to set*/public void setLeft(Person left) {this.left = left;}/*** @return the right*/public Person getRight() {return right;}/*** @param right the right to set*/public void setRight(Person right) {this.right = right;}}

h6>personCircle类:

package com.kp;/**@author Fiee@version 创建时间:2019年6月24日 下午1:44:27
*/
public class PersonCircle {/*** 圈对象*//*** 圈中的人数*/private int count;/*** 圈中的第一个人*/private Person first;/*** 圈中的最后一个人*/private Person last;/*** @return the count*/public int getCount() {return count;}/*** @param count the count to set*/public void setCount(int count) {this.count = count;}/*** @return the first*/public Person getFirst() {return first;}/*** @param first the first to set*/public void setFirst(Person first) {this.first = first;}/*** @return the last*/public Person getLast() {return last;}/*** @param last the last to set*/public void setLast(Person last) {this.last = last;}/*** @param count*/public PersonCircle(int count) {super();//this.count = count;for (int i = 0; i < count; i++) {Person p=new Person(i);add(p);}}/*** * @param p 进圈的人*/public void add(Person p){//当圈中没人时if (this.count==0) {this.first=p;this.last=p;}else {p.setLeft(this.last);p.setRight(this.first);this.first.setLeft(p);this.last.setRight(p);this.last=p;}this.count++;}/*** * @param p 出圈的人*/public void remove(Person p){p.getLeft().setRight(p.getRight());p.getRight().setLeft(p.getLeft());//如果删除的是第一个人if (p.equals(this.first)) {this.first=p.getRight();}//如果删除的是最后一个人if (p.equals(p.getLeft())) {this.last=p.getLeft();}this.count--;}public void location(PersonCircle pc){//      //初始化圈
//      PersonCircle pc=new PersonCircle(5);//计数器int countNum=0;Person p=pc.first;while(pc.count>1){countNum++;if (countNum==3) {System.out.println("本次出去的人的ID是:"+p.getId());pc.remove(p);countNum=0;}p=p.getRight();}System.out.println("最后在圈里的人是:"+pc.first.getId());}/*** 打印圈里的id*/public void printAll(){System.out.println(this.first.getId());Person p=this.first.getRight();while (p!=this.first) {System.out.println(p.getId());p=p.getRight();}}}
Test类:
package com.kp;/**@author Fiee@version 创建时间:2019年6月24日 下午2:26:49
*/
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubPersonCircle pc=new PersonCircle(5);pc.printAll();pc.location(pc);}}

三,运行结果

0
1
2
3
4
本次出去的人的ID是:2
本次出去的人的ID是:0
本次出去的人的ID是:4
本次出去的人的ID是:1
最后在圈里的人是:3

数三退一问题||拉手成圈出圈问题相关推荐

  1. 约瑟夫环(数三退一)

    题目是这样(没什么注释): 数三退一问题是: 有一圈(500人)孩子,手拉手围成一个圈,从第一个孩子开始数1,第二个孩子数2,第三个孩子数3,这时候数3的孩子退出,从下一个孩子开始数1,一直循环,直到 ...

  2. Java数三退一问题代码_数三退一问题算法(Java)

    数三退一问题是,有一圈孩子,手拉手围成一个圈,从第一个孩子开始数1,第二个孩子数2,第三个孩子数3,这时候数3的孩子退出,从下一个孩子开始数1,一直循环,直到最后剩下一个孩子,问这个孩子的位置? 两种 ...

  3. n个人围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数, 数到m的人再出圈,……依次类推, 直到所有的人都出圈,请输出依次出圈人的编号.

    88,n个人围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数, 数到m的人再出圈,--依次类推, 直到所有的人都出圈,请输出依次出圈人的编号. 输入 n m 输出 出圈的编号 ...

  4. 题目98-4:n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

    题目转载:http://python.wzms.com/s/1/103 题目描述: n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再 ...

  5. 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈...

    一 群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停的 进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...

  6. 绕圈报数游戏Java算法_经典游戏(围圈数数,数到3者出圈,求最后幸存者)

    [java]代码库import java.util.Scanner; /** * 约瑟夫问题 * 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,下个人继续开始从 ...

  7. 出圈问题(java)-----n个人围成一圈,数到key或者key的倍数,出圈,问剩下的最后一个人原来的位置是多少?

    出圈问题---n个人围成一圈,数到key或者key的倍数,出圈,问剩下的最后一个人原来的位置是多少? java版 1.n个人围成一圈,说明它是重复循环的,头就是尾. 2.每次数key或者key的倍数, ...

  8. 《人生重开模拟器》爆火出圈,3天2亿流量却源于群内自嗨,网友:我提前看遍人生的无常...

    杨净 丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 有没有一款游戏,让你可以提前看遍人生的无常? 最近,就有一款游戏刷屏全网,它叫做人生重开模拟器. 它在短短3天就创造2亿访问量. 在这 ...

  9. 云队友丨新品牌的营销大战:砸进上百万,苦心博出圈

    出品 | 创业最前线 作者|李小反 编辑 |蛋总 "用户的注意力在哪里,价值就在哪里",这条规律被互联网从业者奉为圭臬,同时也是如今各品牌在营销策划时所遵从的"铁律&qu ...

最新文章

  1. linux进程管理之进程创建
  2. the mysql is running_Mysql报错:TheMySQLserverisrunningwiththe--skip-grant-
  3. fitnesse - 框架介绍
  4. java 为什么序列化_java类为什么要序列化
  5. python函数调用的一般形式_Python的函数的定义与使用示例
  6. 记录一次bug解决过程:数据迁移
  7. UVA5876 Writings on the Wall 扩展KMP
  8. 如何将XML文件导入Excel中
  9. webrtc 渲染_[WebRTC架构分析]采样率转换
  10. 【BZOJ 1951】 [Sdoi2010]古代猪文
  11. 对编辑框进行赋值和取值
  12. 教程-TObjectList.Clear、TStringList.Clear方法对象有没有被释放
  13. Linux driver读书笔记(2) - Bus Types总线类型(mybus/mydevice/mydriver实例)
  14. PDF有口令密码怎么移除?
  15. 郭盛华是如何登上神坛?令全世界认识了中国的黑科技
  16. react Hook useState()
  17. 飞速创新更新IPO招股书:计划募资约14亿元,向伟为实际控制人
  18. 有什么好用的苹果群控软件?
  19. Flutter高仿微信-第22篇-支付-二维码收款(二维码)
  20. node os模块读取hostname乱码

热门文章

  1. android webView 全屏播放网络视频
  2. JS去除输入文本的所有空格、逗号、换行符等空白字符
  3. vue学习笔记--动画
  4. CVPR2022知识蒸馏用于目标检测:Focal and Global Knowledge Distillation for Detectors
  5. matlab 双y轴 三y轴
  6. 创蓝253国际短信调用接口说明
  7. 将进酒:《惜樽空》敦煌抄本
  8. 002-windowa基础(DOS命令:net user 用户 密码 /add)
  9. 【算法复习】迭代改进
  10. 【华人学者风采】俞汝勤 湖南大学