500个小朋友手拉手围成一个圈,依次按1、2、3报数,报到3的出列,最后一个留在圈里的是第几个?

public class Count3Quit{

    //从数组的角度
    public void m1(){

        boolean[] child = new boolean[500];

        for(int i=0;i<child.length;i++){
            child[i] = true;
        }

        int count = 0;
        int left = child.length;
        int index = 0;

        while(left > 1){
            if(child[index]){
                count++;
            }
            if(count == 3){
                child[index] = false;
                left--;
                count = 0;
            }
            index++;
            if(index == 500){
                index = 0;
            }
        }

        for(int i=0;i<child.length;i++){
            if(child[i]){
                System.out.println(i);
            }
        }
    }

    //从类的角度
    public void m2(){
        Circle circle = new Circle(500);
        Child d = circle.first;
        int num = 0;
        while(circle.count > 1){
            num++;

            if(num == 3){
                circle.delete(d);
                num = 0;
            }
            d = d.right;
        }
        System.out.println(circle.first.index);
    }

        public static void main(String[] args){
        Count3Quit c = new Count3Quit();
        c.m1();
        c.m2();
    }

}

class Circle{

    int count = 0;
    Child first,end;

    public Circle(int num){
        for(int i=0;i<num;i++){
            add();
        }
    }

    void add(){
        Child c = new Child(count);
        if(count == 0){
            c.left = c;
            c.right = c;
            first = c;
            end = c;
        } else{
            c.left = end;
            end.right = c;
            end = c;
            c.right = first;
            first.left = c;
        }
        count++;
    }

    void delete(Child c){
        if(count == 0){
            System.out.println("空空如也");
            return;
        } else if(count == 1){
            first = end = null;
        } else{
            c.left.right = c.right;
            c.right.left = c.left;

            if(c == first){
                first = c.right;
            } else if(c == end){
                end = c.left;
            }
        }
        count --;
    }
}

class Child{

    int index;
    Child left;
    Child right;

    public Child(int index){
        this.index = index;
    }

}

原文地址:https://www.cnblogs.com/yxfyg/p/12342623.html

时间: 2024-08-03 18:15:33

500个小朋友手拉手围成一个圈,依次按1、2、3报数,报到3的出列,最后一个留在圈里的是第几个?的相关文章

300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子

public static void main(String[] args) { /* * 300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子, * 问最后剩下的一个是从指定位置开始计数的第几个人? */ int num[]=new int[300]; int i=0; // 数组的下标计数器 0---299 int count=0; // 退出的人数计数器 0---299 int n=1; // 数数的计数器 1---3 while(count<299){ //

Java迭代器问题 有100个人围成一个圈从1开始报数,报到14的这个人就要退出,然后其他人重新开始,从1报数,到14退出问:最后剩下的是100人中的第几个人 用listIterator迭代元素,并对集合进行删除操作

package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIterator_baoshu14 { public static void main(String[] args) { /* * 第9题: 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出. * 然后其他人重新开始,从1报数,到14退出.问:最后剩

智慧城市,在中国的北海边再画一个圈——大连“中国首届智慧城市协同创新峰会”请你带好笔

这可能是中国第二次大规模地改变城市印象.从1979年,"在中国的南海边画了一个圈",用三十多年的时间,中国完成了从传统城市到现代城市的跨越,繁荣.机会.财富.梦想演变成激动人心的中国奇迹和城市骄傲.但随之而来,城市化进程也引发诸多的问题,社会保险.医疗.就业.安防.交通--所有的这些问题都为生活于此的每个城居者带来困扰. 现代化的中国城市需要改变,城市的管理需要提升,所有人都在发问,城市未来的发展空间在哪,围绕城市建设,商机在哪?如果城市已经拥有了摩天大楼.地铁公交.城际轻轨.繁华商铺

[再寄小读者之数学篇](2014-10-27 两曲面围成的区域的体积与表面积)

(from M.J. Shu) 设立体 $\vSa$ 由 $x^2+y^2=2z$ 与 $z=4-\sqrt{x^2+y^2}$ 围成, 求 $\vSa$ 的体积与表面积. 解答: 该区域由旋转抛物面与圆锥面围成. 所求体积为 $$\beex \bea V&=\int_0^2 \pi \cdot 2z\rd z +\int_2^4 \pi \cdot (4-z)^2\rd z\\ &\quad\sex{x^2+y^2=2z,\quad x^2+y^2=(4-z)^2}\\&=4\p

Agent J(求三个圆围成的区域面积)

A - A Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1331 Description Agent J is preparing to steal an antique diamond piece from a museum. As it is fully guarded and they are guarding it usi

围成面积

围成面积 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1359时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目.如下图所示,在10*10的二维数组中,有"*"围住了15个点,因此面积为15. [输入] 10×10的图形. [输出] 输出面积. [输入样例] 0 0 0

有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。 输入描述: 第一行为一个整数n

有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置).小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界).大反派超超想去捕捉可爱的小易,他手里有n个陷阱.第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉.你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易. 输入描述: 第一行为一个整数n(n ≤ 1000),表示超超一共拥有n个陷阱. 第二行有n个整数xi,表示第i个陷阱的横坐标 第三行

在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在"D:\java"文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 myPackage 包中创建一个YMD类,该类具有计算今年的年份.可以输出一个带有年月日的字符串的功能.设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名.年龄.出生日期.程序使用YMD的方法来计算年龄. 主要考包的运用 用到java.util.Calendar

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号.在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变.但是,调用该函数时,可以传入任意个参数,包括0个参数: def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum >>> calc(1, 2, 3) 14 >>> calc(1, 3, 5, 7) 84 def calc(