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
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人中的第\个人\ } }
黑马程序员济南中心 编著