有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;
    }

 

posted on 2018-03-09 15:58  猫咪大王  阅读(486)  评论(0)    收藏  举报