说明
有一群俘虏n个人,但是粮食只够一个人吃,这群俘虏只能剩下一个人,其他人都得死。把刀给第1个人,第1个人杀掉第2个人,然后把刀给第3个人,第3个人杀掉第4个人,然后把刀给第5个人…最后只剩1个人。
如上图所示:1杀2,1把刀给3,3杀4,3把刀给5,5杀6,5把刀给7,7杀8,7把刀给9,现在只剩下1、3、5、7、9
根据上面地规则继续,最后只剩下3存活
那么给定一个列表,根据Jocephus杀人规则得到最后一个幸存者。
问题分析
代码
/**
* Jocephus杀人问题
* @author jeffrey
* @date 3/25/20 8:58 AM
*/
public class JocephusKill {
public static void main(String[] args) {
List<String> humans = new ArrayList<>();
humans.add("张1");
humans.add("张2");
humans.add("张3");
humans.add("张4");
humans.add("张5");
humans.add("张6");
humans.add("张7");
humans.add("张8");
humans.add("张9");
System.out.println(getLast(humans));
}
public static String getLast(List<String> humans) {
Queue<String> queue = new LinkedBlockingQueue<>(humans.size());
queue.addAll(humans);
while (queue.size() > 1) {
String killer = queue.poll();
String killed = queue.poll();
queue.add(killer);
}
return queue.poll();
}
}