我正在研究幸存者问题,如下所示:这是source
完整的问题文本:花一点时间想象你在 房间有100把椅子围成一圈。这些椅子都有编号 顺序从一百到一百。
在某个时间点,第1号椅子上的人将被告知离开 房间。第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,如要求中所述。任何人都可以帮我吗?
答案 0 :(得分:2)
我的回答是你在count
之后引入了第二个变量类型为indexOfChair
并初始化为1.现在在while
循环而不是使用indexOfChair++
使用indexOfChair += count;
然后将count
增加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
}
答案 1 :(得分:0)
您计算要删除的indexOfChair错误。最新移除的椅子的位置在每次迭代中都会丢失。您必须保留最新删除的椅子位置并向其添加递增的indexOfChair。
答案 2 :(得分:0)
问题类似于约瑟夫斯问题。使用递归策略可能更容易:进行第一次消除,并递归地将算法应用于剩余的组。类似的东西:
findSurvivor(int start, int skip, ArrayList<Integer> chairs)
if chairs contains one element declare winner and return
else findSurvivor((start+skip)%(chairs.size()-1), skip+1, chairs with start removed)