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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.itheima;

  2. import java.util.LinkedList;

  3. /**
  4. * @author Mr 10、
  5. *         有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  6. */
  7. public class Test10 {
  8.         public static void main(String[] args) {
  9.                 // 因为频繁删除所以用LinkedList
  10.                 LinkedList<Integer> nums = new LinkedList<Integer>();
  11.                 for (int i = 1; i <= 100; i++) {
  12.                         nums.add(i);
  13.                 }

  14.                 System.out.println(nums);
  15.                
  16.                 int flag = 0;
  17.                 loop: while (true) {// 将普通队列模拟成循环队列结构,并定义跳出点,开始遍历循环队列
  18.                         for (int i = 0; i < nums.size(); i++) {
  19.                                 Integer num = nums.get(i);
  20.                                 if (++flag == 14) {// 如果是计数第14个 删除该元素
  21.                                         nums.remove(num);
  22.                                         i--;// 元素减少一个 ,循环指针跟着动
  23.                                         System.out.println("删除:" + num);
  24.                                         System.out.println("剩余:" + nums);
  25.                                         flag = 0;// 计数归零
  26.                                         if (nums.size() == 1)
  27.                                                 break loop;
  28.                                 }
  29.                         }
  30.                 }

  31.         }
  32. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

9 个回复

倒序浏览
感谢加分
回复 使用道具 举报
谢谢分享{:2_32:}
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
楼主面试没有?
回复 使用道具 举报
感谢分享
回复 使用道具 举报
感谢分享
回复 使用道具 举报
你的程序我运行了一下,结果是错误的。
问题在于你理解题目有问题,题目中说,如果遇到14就将这个人移除,然后其他人重新开始

所以先不管程序,退出的人应该是14,15,16,17……100,即从14号开始退出,然后重新开始数则原来的15号变成了14号,依次类推,所以首先是14号到100号逐一退出。

希望楼主再接再厉!
回复 使用道具 举报
感谢分享,又学到了新东西,。谢谢
回复 使用道具 举报
这个题目有意思……这种循环思想挺牛了,主要是控制好指针flag,就好理解了……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马