幸存者编程挑战

时间:2015-04-28 05:34:28

标签: java algorithm

我正在研究幸存者问题,如下所示:这是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,如要求中所述。任何人都可以帮我吗?

3 个答案:

答案 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)