我正在处理一个幸存者问题,如下所示:这是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
}