使用一个布尔数组,其中所有值都初始化为true,并将它们变为false,直到剩下一个

时间:2014-12-04 21:30:16

标签: java arrays boolean

我有一个设置为x的随机数和一个初始化为true的布尔数组。我需要能够以随机数(x)开始并将每第三个值转为false,直到剩下一个真值。真正的价值是新的“赢家”。这是我到目前为止所有的建议都很棒。

int win;
for( win = x; win < trueStatus.length; win++)
    {
        if((win % 3 == 0 && trueStatus[win]==true))
        {
            trueStatus[win]=false;
        }
    }

2 个答案:

答案 0 :(得分:0)

首先,您win的标准(最后一个仍为true)要求您每次都获得一个新的随机数....基本上,您需要一些东西来计算{{1你true中的(s)。使用可能类似

for-each loop
boolean[]

然后你可以循环直到有赢家之类的

private static int countTrues(boolean[] arr) {
    int c = 0;
    for (boolean b : arr) {
        if (b) {
            c++;
        }
    }
    return c;
}

另外,如果你想以三的倍数进行迭代,请使用public static void main(String[] args) throws Exception { boolean[] trueStatus = new boolean[10]; Arrays.fill(trueStatus, true); Random rand = new Random(); while (countTrues(trueStatus) > 1) { trueStatus[rand.nextInt(trueStatus.length)] = false; } for (int i = 0; i < trueStatus.length; i++) { if (trueStatus[i]) { System.out.println("winner at " + i); break; } } // Display entire array to prove there is only one "true" System.out.println(Arrays.toString(trueStatus)); } (它的更快然后递增1并使用模3进行测试)。

答案 1 :(得分:0)

我提出的解决方案:

private static int findWinner(boolean[] trueStatus, int x) {
    int win = 0;
    if (trueStatus == null || trueStatus.length % 3 == 0 || x < 0 || x >= trueStatus.length) {
        throw new IllegalArgumentException();
    }
    int numberOfTrues = trueStatus.length;

    if (trueStatus.length == 1) {
        return 0;
    }


    if (trueStatus.length == 2) {
        return 1 - x;
    }

    int index = x;
    while (numberOfTrues > 1) {
        if (trueStatus[index]) {
            trueStatus[index] = false;
            numberOfTrues--;
            index = (index + 3) % trueStatus.length;
        }
    }

    for (int i = 0; i < trueStatus.length; i++) {
        if (trueStatus[i]) {
            win = i;
            break;
        }
    }


    return win;
}

编辑:还有更聪明的方法来查找公式,在这种情况下应该是:

win = (trueStatus.length - 3 + x) % trueStatus.length;

完整的方法将是:

private static int findWinner(boolean[] trueStatus, int x) {
    int win = 0;
    if (trueStatus == null || trueStatus.length % 3 == 0 || x < 0 || x >= trueStatus.length) {
        throw new IllegalArgumentException();
    }
    int numberOfTrues = trueStatus.length;

    if (trueStatus.length == 1) {
        return 0;
    }


    if (trueStatus.length == 2) {
        return 1 - x;
    }

    win = (trueStatus.length - 3 + x) % trueStatus.length;

    return win;
}