我正在处理一个幸存者问题,如下所示:这是source

完整的问题文本:花点时间想象一下自己在
房间里有100个椅子,围成一圈。这些椅子编号
从一百到一百。

在某个时间点,将告诉1号椅子上的人离开
房间。 2号椅子上的人将被跳过,而2号椅子上的人将被跳过
3号椅子将被告知离开。接下来要坐的是6号椅子上的人。在
换句话说,最初将跳过1个人,然后跳过2、3、4。
等等。这种跳过模式会绕圈转
直到只剩下一个人..幸存者。请注意
人离开房间时,椅子被移开。

编写一个程序来确定幸存者坐在哪把椅子上。

下面是我的代码:

public class ChairProblem {

    public static void main(String[] args) {
        System.out.println(getSurvivors(100));
    }

    private static int getSurvivors(int numChairs) {
        if (numChairs < 1) {
            return -1;
        }

        // populate chair array list
        ArrayList<Integer> chairs = new ArrayList<Integer>();
        for (int i = 0; i < numChairs; i++) {
            chairs.add(i + 1);
        }

        // removing all but one elements
        int indexOfChair = 0;
        while (chairs.size() > 1) {
            chairs.remove(indexOfChair);
            indexOfChair++;// skip every other chair
            indexOfChair %= chairs.size();// loop to beginning if necessary
        }

        return chairs.get(0);
    }
}

我的上述方法并未按照要求中所述先驱逐#1,然后#3,然后#6。谁可以帮我这个事?

最佳答案

我的答案是,您在count之后引入第二个变量,即int类型的indexOfChair,并初始化为1。

    int indexOfChair = 0;
    int count = 1;
    while (chairs.size() > 1) {
        chairs.remove(indexOfChair);
        indexOfChair += count;// skip the count number of chairs
        count++; //increase the number of chairs to skip by 1
        indexOfChair %= chairs.size();// loop to beginning if necessary
    }

08-24 14:14