复习笔记 队列

复习笔记 队列_第1张图片

复习笔记 队列_第2张图片

约瑟夫问题:

约瑟夫问题:有 N 个人围成一圈,每个人都有一个编号,编号由入圈的顺序决定,第一个入圈的人编号为 1,最后一个为 N,从第 k (1<=k<=N)个人开始报数,数到 m (1<=m<=N)的人将出圈,然后下一个人继续从 1 开始报数,直至所有人全部出圈,求依次出圈的编号。

        Queue queue = new LinkedList<>();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            queue.add(i);
        }
        int count = 0;
        while (!queue.isEmpty()) {
            Integer poll = queue.poll();
            count++;
            if (count == m) {
                System.out.println(poll);
                count = 0;
            } else {
                queue.add(poll);
            }
        }

思路很简单 利用队列的特性 让排队的人想象成一个圈 定义一个计数模拟遍历出来的人的排行 每次遍历判断该人排行是不是m 如果是的话 移除不再放入队列 记数变0 如果不是移除再放入队列 计数+1  

你可能感兴趣的:(笔记)