A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

a9623a

中级黑马

  • 黑马币:-143

  • 帖子:70

  • 精华:0

  1. package test;

  2. import java.util.ArrayList;

  3. public class Mytest {

  4.         public static void main(String[] args) {
  5.                
  6.                 System.out.println(getPerson(100));
  7.         }
  8.        
  9.         public static int getPerson(int count) {
  10.                
  11.                 ArrayList<Integer> as = new ArrayList<>(100);
  12.                 for (int i = 0;i < count;i++) {
  13.                         as.add(i + 1);
  14.                 }

  15.                 return  getNumber(as, 0);
  16.                
  17.         }
  18.        
  19.         public static int getNumber(ArrayList<Integer> as,int numberEnd) {
  20.                 for (int i = 0;i < as.size();i++) {
  21.                         if ((as.get(i) + numberEnd) % 14 == 0) {
  22.                                 as.remove(i);
  23.                         }
  24.                 }
  25.                
  26.                 if (as.size() > 1) {
  27.                         numberEnd += as.get(as.size() - 1);
  28.                         getNumber(as,numberEnd);
  29.                 }
  30.                
  31.                 return as.get(0);
  32.         }

  33. }
复制代码

有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
我使用递归算出来是55,不知道有没有大神来帮忙鉴定一下.



6 个回复

倒序浏览
不是92吗?
回复 使用道具 举报
好像不是55
回复 使用道具 举报
import java.util.ArrayList;

public class Ezample {
        public static void main(String[] args) {
                ArrayList<Integer> array=new ArrayList<Integer>();
                for(int i=1;i<=100;i++)
                        array.add(i);
                int i=0;
                while(array.size()>1){
                        i=(i+14-1)%array.size();
                        System.out.println("删除"+array.remove(i));
                }
                System.out.println(array.get(0));
        }

}


是92
回复 使用道具 举报
  1. package test;

  2. public class Person {
  3.         private int value;
  4.         private Person previousPerson;
  5.         private Person nextPerson;
  6.        
  7.         public Person() {};
  8.         public Person(int value) {
  9.                 this.value = value;
  10.         }
  11.         public Person(int value,Person previousPerson) {
  12.                 this.value = value;
  13.                 this.previousPerson = previousPerson;
  14.         }
  15.         public int getValue() {
  16.                 return value;
  17.         }
  18.         public void setValue(int value) {
  19.                 this.value = value;
  20.         }

  21.         public Person getNextPerson() {
  22.                 return nextPerson;
  23.         }
  24.         public void setNextPerson(Person nextPerson) {
  25.                 this.nextPerson = nextPerson;
  26.         }
  27.         public Person getPreviousPerson() {
  28.                 return previousPerson;
  29.         }
  30.         public void setPreviousPerson(Person previousPerson) {
  31.                 this.previousPerson = previousPerson;
  32.         }
  33.        
  34.        
  35. }
  36. package test;


  37. public class Mytest {

  38.         public static void main(String[] args) {
  39.                

  40.                 Person first = new Person(1);
  41.                 Person pre = first;
  42.                 for (int i = 2;i < 100;i++) {
  43.                         Person p = new Person(i, pre);
  44.                         pre.setNextPerson(p);
  45.                         pre = p;
  46.                 }
  47.                 Person last = new Person(100, pre);
  48.                 pre.setNextPerson(last);
  49.                
  50.                 last.setNextPerson(first);
  51.                 first.setPreviousPerson(last);
  52.                
  53.                 Person p = first;
  54.                 int count = 1;
  55.                 while (p.getNextPerson() != p) {
  56.                         if (count % 14 == 0) {
  57.                                 System.out.println(p.getValue() + "出局");
  58.                                 Person prePerson = p.getPreviousPerson();
  59.                                 Person nextPerson = p.getNextPerson();
  60.                                
  61.                                 prePerson.setNextPerson(nextPerson);
  62.                                 nextPerson.setPreviousPerson(prePerson);
  63.                                 p = nextPerson;
  64.                                
  65.                                 count = 1;
  66.                         } else {
  67.                                 p = p.getNextPerson();
  68.                                 count++;
  69.                         }
  70.                 }
  71.                 System.out.println("最后还剩第" + p.getValue() + "人");

  72.                
  73.         }
  74. }
复制代码

谢谢各位提醒,是错误的。
我重新写了一个,仿照链表的方式写的, 答案是92了。

回复 使用道具 举报
//面向对象的思路去做
public class Test9 {       
        public static void main(String[] args) {
                //调用后面的Personcircle类,有100人
                Personcircle pc = new Personcircle(100);
                //用countNumber计数,等于14的人退出,原来右边的人重新报1
                int countNumber  = 0;
                Person p = pc.first;
                while (pc.count > 1) {
                        countNumber ++;
                        if( countNumber == 14){
                                countNumber = 0;
                                pc.delete(p);
                        }
                p = p.right;
        }
        //打印剩下的一个人的位置       
        System.out.println("原排在第"+(pc.first.id+1)+"位的人留下了。");
        }
}
//person类,属性包括ID,左边人,右边人。
class Person{
        int id;
        Person left;
        Person right;
}
//Personcircle类,,定义属性
class Personcircle{
        int count = 0;
        Person first,last;
        //Personcircle构造方法
        Personcircle(int n){
                for(int i = 0; i < n; i++){
                        add();
                }
        }
        //添加人的方法
        void add(){
                Person p = new Person();
                p.id = count;
                if(count <= 0){
                        //一个人时,最开始,最后的人都是自己
                        first = p;
                        last = p;
                        p.left = p;
                        p.right = p;
                }
                else{
                        //多人时,相互连接构成圈
                        last.right = p;
                        p.left = last;
                        p.right = first;
                        first.left = p;
                        last = p;
                }
                //表明多了一个人
                count ++;
        }
        //删除人的方法
        void delete (Person p){
                if(count <= 0){
                        return;
                }//就一个人,不用删
                else if (count == 1){
                        first = last = null;
                }
                else{
                        //一个人退出后,原来这个人左右两边的人会互相连接
                        p.left.right = p.right;
                        p.right.left = p.left;
                        //如果正好是第一个人被删除的情况
                        if(p == first){
                                first = p.right;
                                }//如果删除的是最后一个人的情况
                        else if (p ==last){
                                last = p.left;
                        }
                }
                //少了一个人
                count --;
        }
回复 使用道具 举报
我的结果是92
代码如下:
package com.itheima;

import java.util.ArrayList;
public class Test9 {

        public static void main(String[] args) {
                //创建一个集合
                ArrayList<Integer> list = new ArrayList<>();
                //把100人按编号存放到集合中
                for(int i=1; i<=100; i++){
                        list.add(i);
                }
                int count = 1;
                for (int i = 0; list.size() != 1; i++) {
                        //数到一圈的最后一个人,从头开始数
                        if(i  == list.size()){
                                i = 0;
                        }
                        //去掉数14的这个人,并重新开始数数
                        if(count % 14 == 0){
                                list.remove(i--);
                                count = 0;
                        }
                        count++;
                }
                System.out.println(list.get(0));
        }

}

                System.out.println(list.get(0));
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马