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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

看到一个有意思的题目。给大家分享下
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
  1. package com.ticast;

  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.TreeMap;

  5. /**
  6. * 递归算法实现,
  7. *
  8. *
  9. */
  10. public class Test {
  11.         // 存储人员编号 1....N和报号 (1,2,3)的对应关系
  12.         private static TreeMap<Integer, Integer> tm = new TreeMap<Integer, Integer>();

  13.         // 初始化 ,假设有100人
  14.         public static void inint() {
  15.                 for (int i = 1; i <= 300; i++) {
  16.                         // 直接模3后会是1,2,0,将0改为3.
  17.                         tm.put(i, i % 3 == 0 ? 3 : i % 3);
  18.                 }
  19.         }

  20.         /**
  21.          * 算法如下:
  22.          *
  23.          * 1 移除报号为3的人 2 如果只剩两人,则结束 3 根据tm中最后一个人的报号M,重新计算每个人的报号
  24.          * 即第一个人为(M+1)%3,第二个人为(M+2)%3 4 重复第一步.
  25.          *
  26.          * 当然最后剩下的两人的报号肯定为1和2,若继续下去的话,就是报号为2的那个人最终剩下.这一步我没有写
  27.          */
  28.         public static void compute() {
  29.                 // 1 移除报号为3的人
  30.                 Iterator<Map.Entry<Integer, Integer>> it = tm.entrySet().iterator();
  31.                 while (it.hasNext()) {
  32.                         if (it.next().getValue().equals(3)) {
  33.                                 it.remove();
  34.                         }
  35.                 }
  36.                 // 2 如果只剩两人,则结束
  37.                 if (tm.size() <= 2) {
  38.                         return;
  39.                 }
  40.                 // 3 根据tm中最后一个人的报号M,重新计算每个人的报号
  41.                 // 即第一个人为(M+1)%3,第二个人为(M+2)%3
  42.                 resort();
  43.                 // 4 重复第一步.
  44.                 compute();
  45.         }

  46.         public static void resort() {
  47.                 // resort
  48.                 int last = tm.lastEntry().getValue();
  49.                 Iterator<Map.Entry<Integer, Integer>> it = tm.entrySet().iterator();

  50.                 while (it.hasNext()) {
  51.                         last++;
  52.                         it.next().setValue(last % 3 == 0 ? 3 : last % 3);
  53.                 }
  54.         }

  55.         public static void display() {
  56.                 System.out.println(tm);
  57.         }

  58.         public static void main(String[] adfafd) {
  59.                 inint();
  60.                 compute();
  61.                 display();
  62.         }

  63. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

2 个回复

倒序浏览
这不是入学测试题么
回复 使用道具 举报
我不清楚。以前面试的时候遇到过
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马