最近在看关于约瑟夫环的一些解决思路,发现了一种很有创意的解法,记录下,用来复习。
//用于判断某个数是否已经被剔除 boolean[] isChoosed = new boolean[n]; //记录答案数组 int[] array = new int[n]; //记录人数 int num = n; //记录循环次数,最后的值就能知道你必须要数多少次,才能剩下一个人 int count = 0; //如果人数只有一个人的时候,就结束循环 while (num != 1) { //每一次的循环 for (int i = 0; i < n; i++) { //如果这个位置没有被选择,也就是没有被删除,那么就给他赋值 if (!isChoosed[i]) { count++; array[i] = count; if (count % 3 == 0) { isChoosed[i] = true; num--; System.out.println((i + 1) + "号被淘汰了"); } } } }
这种方式不会破坏原始数组,非常巧妙的用boolean去标记对应数字,虽然消耗了额外的空间,但是是非常有创意的实现方式,可读性很高。