黑马程序员技术交流社区

标题: 这题有意思 [打印本页]

作者: 我本善良。    时间: 2016-7-20 21:48
标题: 这题有意思
10、有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
作者: 崔小旭    时间: 2016-7-21 11:15
本帖最后由 崔小旭 于 2016-7-21 13:29 编辑

package com.heima;

import java.util.ArrayList;
import java.util.Iterator;

public class Test {

/**
* @param args
*/
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Integer> al = new ArrayList<Integer>();//新建一个集合,用于存储这100个人
        for(int i = 1; i<=100; i++){//给集合添加元素
            //添加到集合
            al.add(i);
            ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储每次退出的那个人
            newAl = getQuit();//通过调用getQuit()方法,给集合添加元素
            al.removeAll(newAl);//所有人的集合减去退出的集合,就获得最后剩下没有退出的那13个人
        }
        
        for(Iterator<Integer> it = al.iterator(); it.hasNext();){//迭代取出集合的元素
            System.out.print(it.next()+" ");//打印集合的元素
        }
    }

    private static ArrayList<Integer> getQuit() {//创建一个方法,用于获取每次退出的那个人的角标
        ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储退出的角标
        int count = 0;//定义一个计数器,记录数数的值
        //因为是一个圆圈,假定把这个圆圈拉直,把N个这样的直线连起来,就相当于永远在圆圈转圈。
        for(int i = 1; i<101; i++){//因为有100人,定义一个循环次数为100的循环,i为每个人的角标
            count++;//记录索引值
            while(newAl.contains(i)){//判断集合是否已经添加了i
                i++;//如果集合中已有那个元素,就往后加一个,再判断,直到集合中没有那个元素结束
                if(i==101){//如果是第100个人的话,就从1开始
                    i = 1;
                }
            }
            if(count%14==0){//如果计数器数到14,就将i添加到集合
                newAl.add(i);//把这个元素加到集合去
                count = 0;//把计数器置0;重新计数
            }
            if(i==100){//当数到第100个人的时候
                i=1;//把索引置为1,1开始接着数。
            }
            if(newAl.size()>86)//循环终止条件:当圈子中剩余13个元素,也就是集合里面已经添加了87个就退出循环
            break;//退出循环
        }
        return newAl;//
    }
}
作者: 新晋猿工    时间: 2016-7-21 12:28
上面这代码乱的一批

作者: 崔小旭    时间: 2016-7-21 13:28
package com.heima;

import java.util.ArrayList;
import java.util.Iterator;

public class Test {

/**
* @param args
*/
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Integer> al = new ArrayList<Integer>();//新建一个集合,用于存储这100个人
        for(int i = 1; i<=100; i++){//给集合添加元素
            //添加到集合
            al.add(i);
            ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储每次退出的那个人
            newAl = getQuit();//通过调用getQuit()方法,给集合添加元素
            al.removeAll(newAl);//所有人的集合减去退出的集合,就获得最后剩下没有退出的那13个人
        }
        
        for(Iterator<Integer> it = al.iterator(); it.hasNext();){//迭代取出集合的元素
            System.out.print(it.next()+" ");//打印集合的元素
        }
    }

    private static ArrayList<Integer> getQuit() {//创建一个方法,用于获取每次退出的那个人的角标
        ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储退出的角标
        int count = 0;//定义一个计数器,记录数数的值
        //因为是一个圆圈,假定把这个圆圈拉直,把N个这样的直线连起来,就相当于永远在圆圈转圈。
        for(int i = 1; i<101; i++){//因为有100人,定义一个循环次数为100的循环,i为每个人的角标
            count++;//记录索引值
            while(newAl.contains(i)){//判断集合是否已经添加了i
                i++;//如果集合中已有那个元素,就往后加一个,再判断,直到集合中没有那个元素结束
                if(i==101){//如果是第100个人的话,就从1开始
                    i = 1;
                }
            }
            if(count%14==0){//如果计数器数到14,就将i添加到集合
                newAl.add(i);//把这个元素加到集合去
                count = 0;//把计数器置0;重新计数
            }
            if(i==100){//当数到第100个人的时候
                i=1;//把索引置为1,1开始接着数。
            }
            if(newAl.size()>86)//循环终止条件:当圈子中剩余13个元素,也就是集合里面已经添加了87个就退出循环
            break;//退出循环
        }
        return newAl;//
    }
}

作者: 新晋猿工    时间: 2016-7-21 14:51
讲道理 上面最后得到的应该是个13个元素的吧,而题目要的是要个元素而已,所以是不对的
作者: 新晋猿工    时间: 2016-7-21 14:53
第2个人               
作者: 崔小旭    时间: 2016-7-26 16:35
我只能说你出门不带脑子,仔细想好了在来说吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2