有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
经典的问题。
我的想法是使用队列实现,首先初始化,然后通过两个步骤筛选出需要的数据:
1、挑选报数为3的数据,不加入队列
2、将挑选后的数据重新排序(重新报数)
下面是我的代码
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; public class Test0308 { public static void main(String[] args){ System.out.println(new Test0308().getNum(6)); } /** * 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 * @param n * @return */ public String getNum(int n){ LinkedList<Map<String,Integer>> linkedList = new LinkedList<Map<String, Integer>>(); //初始化 将数据保存在队列中 for(int i=1;i<=n;i++){ Map<String,Integer> map = new HashMap<String, Integer>(); int value = i%3; map.put(String.valueOf(i),value); linkedList.add(map); } int size = linkedList.size(); System.out.println("size: " + size); while(size > 1) { //挑选出报数为3的数据 for (int i = 0; i < size; i++) { Map<String, Integer> map = linkedList.poll(); String key = (String)map.keySet().toArray()[0]; if (map.get(key) != 0) { linkedList.add(map); } } size = linkedList.size(); //将队列中的元素重新赋值 Map<String,Integer> lastMap = linkedList.getLast(); String lastKey = (String)lastMap.keySet().toArray()[0]; int lastValue = lastMap.get(lastKey); int firstValue = (lastValue+1)%3; for(int i=0;i<size;i++){ Map<String, Integer> map = linkedList.poll(); String key = (String)map.keySet().toArray()[0]; map.put(key,firstValue); linkedList.add(map); firstValue = (++firstValue)%3; } } String resultKey = (String)linkedList.peek().keySet().toArray()[0]; return resultKey; }
浙公网安备 33010602011771号