说明

有一群俘虏n个人,但是粮食只够一个人吃,这群俘虏只能剩下一个人,其他人都得死。把刀给第1个人,第1个人杀掉第2个人,然后把刀给第3个人,第3个人杀掉第4个人,然后把刀给第5个人…最后只剩1个人。

Screenshot from 2020-03-25 08-48-30.png
如上图所示:1杀2,1把刀给3,3杀4,3把刀给5,5杀6,5把刀给7,7杀8,7把刀给9,现在只剩下1、3、5、7、9
Screenshot from 2020-03-25 08-50-53.png
根据上面地规则继续,最后只剩下3存活

Screenshot from 2020-03-25 08-54-04.png
那么给定一个列表,根据Jocephus杀人规则得到最后一个幸存者。

问题分析

Screenshot from 2020-03-25 09-27-24.png

代码

  1. /**
  2. * Jocephus杀人问题
  3. * @author jeffrey
  4. * @date 3/25/20 8:58 AM
  5. */
  6. public class JocephusKill {
  7. public static void main(String[] args) {
  8. List<String> humans = new ArrayList<>();
  9. humans.add("张1");
  10. humans.add("张2");
  11. humans.add("张3");
  12. humans.add("张4");
  13. humans.add("张5");
  14. humans.add("张6");
  15. humans.add("张7");
  16. humans.add("张8");
  17. humans.add("张9");
  18. System.out.println(getLast(humans));
  19. }
  20. public static String getLast(List<String> humans) {
  21. Queue<String> queue = new LinkedBlockingQueue<>(humans.size());
  22. queue.addAll(humans);
  23. while (queue.size() > 1) {
  24. String killer = queue.poll();
  25. String killed = queue.poll();
  26. queue.add(killer);
  27. }
  28. return queue.poll();
  29. }
  30. }