黑马程序员JAVA编程阶梯:基础篇之第二十三章(4)

2020-02-21 18:28

31 } else { 32 break; 33 } 34 }

35 return count; 36 } 37 }

?

集合练习(约瑟夫环)

有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人? [Java] 纯文本查看 复制代码 ? 01 /**

02 * 分析: 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出 然后其他人重新开始,从1报03 到14退出 04 *

05 * 思路:1.定义一个计数器每计数到14就删除掉报数的那个角标所对应的值,并把计数器值恢复初始值

06 * 2.接着还是在被删除的角标位置开始循环,为了还是在该角标循环那么可以将现在循环到的角标-1处理,它07 会在下次循环中+1,那么下次的 08 * 循环也就是在当前循环角标位置开始

黑马程序员济南中心 编著

09 * 3.因为是围成一个圈报数,所以当循环到末尾时又要从0角标开始,那么当报数到最后一个角标时,先处理10 有可能的删除动作然后判断

11 * 当前角标是否为最后一个角标,是的话赋值为-1,它还会在下次循环中+1,那么下次的 循环也就是0角标12 标位置又开始循环

13 * 4.最后还要判断集合的长度是否为1,因为要留最后一个人,这个人不能删,只要满足条件则结束循环并打14 集合中仅有的一个元素

15 * 那么该元素也就是100人当中的最后一个人 16 */

17 public class Demo { 18

19 public static void main(String[] args) { 20 // 集合里只能存储Integer类型数据

21 List al = new ArrayList(); 22 // 通过循环添加100个元素 23 for (int i = 1; i <= 100; i++) { 24 al.add(i); 25 } 26

27 // 定义一个计数器,这里赋值为1是为了记录0角标从1开始报数 28 int num = 1;

29 for (int y = 0; y < al.size(); y++) {

30 // 当计数器满足了14,即该角标就是报数为14的那个角标,然后删除该角标所对应的元素

黑马程序员济南中心 编著

31 if (num == 14) { 32 al.remove(y);

33 // 删除角标后计数器恢复到初始值 34 num = 1;

35 // 下一次内循环从当前角标开始 36 y = y - 1; 37 } else {

38 // 如果没有报数到14则加1让下一个元素接着报数 39 num++; 40 }

41 // 有剩下的人还是围成一个圈报数,报到最后一个人则下一个报数的应该是第一个人

42 // 那么报到最后一个人后,应该把循环角标再次调为0,这里赋值-1在上边会进行+1处理43 if (y == (al.size() - 1)) 44 y = -1;

45 // 如果参与报数的人剩下一个了那么就不用再去参与循环报数了,他就是最后剩下的那个人46 if (al.size() == 1) break; }

System.out.println(\最后剩下人的是100人中的第\个人\ } }

黑马程序员济南中心 编著


黑马程序员JAVA编程阶梯:基础篇之第二十三章(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高考历史冲刺押题小题训练(选择题)3(含解析)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: