黑马程序员技术交流社区
标题:
下面有一道入学考试题:
[打印本页]
作者:
qingxi1
时间:
2014-8-7 14:21
标题:
下面有一道入学考试题:
下面有一道入学考试题:
有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
我的写法是:
public class Test {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList<Integer>();
for(int i = 1; i<=100; i++)//给集合添加元素
al.add(i);//添加到集合
ArrayList<Integer> newAl = new ArrayList<Integer>();
newAl = getQuit();
al.removeAll(newAl);
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;
for(int i = 1; i<101; i++){
count++;
while(newAl.contains(i)){
i++;
if(i==101){
i = 1;
}
}
if(count%14==0){
newAl.add(i);
count = 0;
}
if(i==100){
i=1;
}
if(newAl.size()>86)//循环终止条件:当圈子中剩余13个元素,也就是集合里面已经添加了87个就退出循环
break;
}
return newAl;
}
}
在这个程序中,我是认为最后剩下来的是十三个人,就无法在进行数数了,后来和一个朋友交流,他认为最后剩下来的应该是一个人,因为他们一直在循环,不知道那个对,如果剩下一个人,代码应该怎样写;
作者:
es2379649
时间:
2014-8-7 14:45
List<String> al = new ArrayList<String>();
for(int i=1;i<=100;i++){
al.add("人"+i);
}
while(al.size()>1){
if(al.size()>=7){
al.remove(6);
}else{
al.remove((7%al.size())-1);
}
}
System.out.println(al.remove(0));
我是这么想的
作者:
es2379649
时间:
2014-8-7 15:05
想错了,刚才以为7个人去一个呢。
for(int i=1;i<=100;i++){
al.add("人"+i);
}
while(al.size()>1){
if(al.size()>=14){
al.remove(13);
}else{
int size = 14%al.size();
if(size==0){
al.remove(al.size()-1);
}else{
al.remove((14%al.size())-1);
}
}
}
System.out.println(al.remove(0));
作者:
黎志勇
时间:
2014-8-7 15:19
刚刚把自己原来的代码重写了下,发现原来可以这么短就能实现。
import java.util.LinkedList;
import java.util.List;
public class Test4 {
public static void main(String[] args) {
game(100, 14);
}
public static void game(int person, int num) {
List<Integer> list = new LinkedList<Integer>();
for (int i = 1; i <= person; i++) {
list.add(i);
}
int pos = 0;
while (list.size() > 1) {
pos = (pos + num - 1) % list.size();
list.remove(pos);
}
System.out.println(person + "人玩数" + num +
",最后剩下的是第" + list.get(0) + "人");
}
}
复制代码
作者:
star5603
时间:
2014-8-7 17:13
public static void Method() {
boolean[] bo = new boolean[100];
int count = 0;
int leave = 100;
for (int i = 0; i < bo.length; i++) {
if (leave == 1) {
break;
}
if (bo[i]==false) {
count++;
// System.out.println(count);
if (count ==14) {
bo[i] = true;
count = 0;
leave--;
System.out.println(i);
}
}
if (i == bo.length - 1) {
i = -1;
}
}
for (int i = 0; i < bo.length; i++) {
if (bo[i]==false) {
System.out.println(i);
}
}
}
}
复制代码
我是这么想的,boolean数组100个元素默认都是false,一个计数器,开始数,只要是false,计数器就+1,当到14的时候,就把当前元素变成true,计数器置为0,重新计数,当前是true时,计数器不增加,跳出当前迭代。当数组角标到达99时,重新置为0,再开始。最后剩下一个false就是要求的。
作者:
yanyoucheng520
时间:
2014-8-7 19:30
你的代码太多了,别人会看的很累啊,大概12行就可以搞定了
作者:
我为你着迷
时间:
2014-8-7 19:43
感觉搞高端的样子呢
作者:
柳超
时间:
2014-8-7 19:57
首先説你这个问题属于 约瑟夫环 百度可以找到很我代码!
我今天写了一个不过和你这个有点小区别 这个数字是连续的不会在一个人出局后从1开始
import java.util.*;
class Asd
{
public static void main(String[] args)
{
//定义一个ArrayList来存放人 我这里是8个人
List<Integer> li= new ArrayList<Integer>();
for(int y=1;y<9;y++)
{
li.add(y);
}
//count 计数器 记录第个人报的数字,我这个是连续的不是从头来的,和从头来一个样子第下掉一个人初始化就可以了
for(int count=1,x=0;li.size()!=1;)
{
// x是一个角标,一定要最先处理这个,不然可能会出现角标越界
if(x==li.size()) // 如果 x=li.size(),角标越界! 这里把角标重新定向到0位置的元素
{
x=0;
}
//数到3的人出局 也是这个数字%3为0 ,因为我的数是连续的所以这里出局一个人角标会变化所以X这里不能处自增
if(count%3==0)
{
li.remove(x);
count++;
}
//如果没有人出局两个变量都要自增
else
{
x++;
count++;
}
}
System.out.println(li);
}
}
复制代码
作者:
Imp_x
时间:
2014-8-7 20:58
好多高手啊= =
作者:
花花公子
时间:
2014-8-29 18:25
黎志勇 发表于 2014-8-7 15:19
刚刚把自己原来的代码重写了下,发现原来可以这么短就能实现。
厉害。想法真好。
作者:
双皮奶
时间:
2014-9-4 21:48
黎志勇 发表于 2014-8-7 15:19
刚刚把自己原来的代码重写了下,发现原来可以这么短就能实现。
赞一个,机智的骚年
作者:
刃下心
时间:
2014-9-5 01:26
都这么能敲代码
作者:
静水流华
时间:
2014-9-5 18:44
不知道,估计考不上了,:'(
作者:
baiiiu
时间:
2014-9-6 22:47
大神呀,仔细看看
作者:
想做开发
时间:
2014-9-8 12:02
黎志勇 发表于 2014-8-7 15:19
刚刚把自己原来的代码重写了下,发现原来可以这么短就能实现。
报道14的退出后是从第一个开始,还是从第15个啊。还有剩下13个还是循环么?就是到了报13的之后,报14的就成了1了么
作者:
375798258
时间:
2014-9-18 01:45
本帖最后由 375798258 于 2014-9-18 01:56 编辑
package com.itheima;
/*
* 10、 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
* 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
*/
import java.util.*;
class Test10 {
public static void main(String[] args) {
//定义一个集合1-100
ArrayList<Integer> a1=new ArrayList<Integer>();
//a2用来存储数到14的a1中第几个下标
ArrayList<Integer> a2=new ArrayList<Integer>();
//向集合中添加100个元素
for (int i = 1; i <=100; i++) {
a1.add(i);
}
//初始化 count 计数个数1-14;x下标
int count=1,x=0;
while(a1.size()>1){
//
while(x<a1.size()){
//存储被14整除a1的下标
if(count==14){
a2.add(x);count=1; x++;
}else{
//count记录数到第几个,x记录集合下标
count++; x++;
}
}
x=0;
//删除a1中以a2中元素为下标的元素,从后往前删保证删除正确
for (int i = a2.size()-1; i >=0; i--) {
int j= a2.get(i);
a1.remove(j);
}
//清楚a2中元素
a2.clear();
}
System.out.println(a1.get(0));
}
}
复制代码
作者:
hi2hcs
时间:
2014-9-22 23:51
学习下!!
作者:
安卓安小虾
时间:
2014-10-25 16:09
刚看了一个递归的 发出来给大家看看!
public class Test10 {
/**
* 10、 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
* 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
*/
public static void main(String[] args) {
int s = 0;
int m = 14;
for(int i=1; i<=100; i++) {
s = (s+m)%i;
}
System.out.println("最后一个留下来的人是:" + (s+1));
}
}
作者:
芭芭拉2
时间:
2014-12-16 13:07
方法不论好坏,当然能简单巧妙解决问题更好。最关键的是要有自己的想法,思想。。。赞一个!
作者:
李相斌
时间:
2015-4-12 17:57
发现这里有好多大神!
作者:
Plus
时间:
2015-5-9 11:28
估计考不上了,:'(
作者:
Accoss-x
时间:
2016-1-1 22:00
思路都差不多,多少有点区别!!!!
作者:
heshaosheng
时间:
2016-1-5 13:07
/*
*有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
*然后其他人重新开始,从1报数,到14退出。
*问:最后剩下的是100人中的第几个人?
*/
package org.javass.jc;
public class BaoShu{
private static int rs = 100;
public static void main(String[] args){
System.out.println("最后剩下的是100人中的第 "+bs(1)+" 个人");
}
public static int bs(int n){
if(rs < 14){ //如果人数小于14,直接返回最后的人数
return rs;
}else if(n == 14){ //如果报数报到14,人数减1且从1开始重报
rs = rs-1;
return bs(1);
}else{ //如果以上都未符合条件将继续往后报数
return bs(n + 1);
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2