约瑟夫环问题

问题:圆圈中最后剩下的数字?

0,1,…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

举个简单例子:A、B、C三个人围成一圈,从A开始报数,报2的人会被杀掉

  • 首先A开始报数,他报1。侥幸逃过了一劫。
  • 接下来B开始报数,他报2。很倒霉,他被杀了。
  • C接着报数从1开始报数。
  • 接着又轮到A报数了,这次不会那么幸运了,他报2,也死掉了。
  • C成为了最后的幸存者,他活了下来。

上面这个问题其实就是著名的约瑟夫环问题(一个经典的数学问题)

/**
 * @Author: 落叶无痕
 * @Date: 2020/3/30 23:20
 */
public class 圆圈中最后剩下的数字 {

    public static int lastRemaining(int n, int m) {
        int win = 0;
        // 最后一轮剩下2个人,所以从2开始逆推
        for (int i = 2; i <= n; i++) {
            win = (win + m) % i;
        }
        return win;
    }

    public static void main(String[] args) {
        long begin = Calendar.getInstance().getTimeInMillis();

        System.out.println(lastRemaining(10, 17));

        long end = Calendar.getInstance().getTimeInMillis();
        System.out.println(end - begin);
    }

}

你可能感兴趣的:(面试题)