Как мне исправить это для каждого l oop in java (неправильный вывод на финальном тесте)? - PullRequest
0 голосов
/ 09 марта 2020

Я изо всех сил пытаюсь запустить этот java правильно с for each l oop. Это хорошо для каждого теста, но последний. Может ли кто-нибудь помочь мне сообщить, где я иду не так? Я уверен, что смогу сделать это с for l oop, но хотел бы сделать это с for each l oop (если подходит).

Drill Вопрос: Учитывая массив целых , верните true, если последовательность чисел 1, 2, 3 появится где-то в массиве.

arrayOneTwoThree([1, 1, 2, 3, 1])  -> true. 

arrayOneTwoThree([1, 1, 2, 4, 1])  -> false. 

arrayOneTwoThree([1, 1, 2, 1, 2, 3])  -> true. 

Например:

int[] array = {2, 1, 2, 3, 2, 3, 2, 4, 1};

System.out.println(arrayOneTwoThree(array));

Результат: true

public static void main(String[] args) {
    //int[] array = {2, 1, 2, 3, 2, 3, 2, 4, 1};
    //int[] array = {1, 1, 2, 3, 1};
    //int[] array = {1, 1, 2, 4, 1};
    int[] array = {1, 1, 2, 1, 2, 3};
    System.out.println(arrayOneTwoThree(array));
}

public static boolean arrayOneTwoThree(int[] nums) {
    for (int num : nums) {
        //System.out.print(num);
        if (nums[num] == 3 && nums[num-1] == 2 && nums[num-2] == 1)
            return true;
    }
    return false;
}

Ответы [ 3 ]

1 голос
/ 09 марта 2020

В l oop num НЕ является индексом в массиве, это значение.

Я думаю, вы ожидаете, что num будет индексом, что было бы в случае, если вы сделали для l oop вида for (int num =0; num < nums.length; num++)

0 голосов
/ 09 марта 2020

Первые тестовые примеры дерева случайно отправил правильный результат!

Ваш код работает ТОЛЬКО для случаев, , когда индекс 1 равен 1, индекс 2 равен 2, и индекс 3 - это 3 :

[*, 1, 2, 3, ......... ]

Возможно, вы перепутали с другим языком программирования. (Может быть для in построения JavaScript?).

In Java для каждого над массивом (или чем-либо еще) повторяется над значениями и никогда над индексами , (Как уже было указано)

Я вижу закомментированные System.out.print(num); почему вы проигнорировали его, печатает значения, а не индексы?

Другая проблема - игнорирование границ массива ... Попробуйте проверить ваши код со следующим массивом:

int[] array = {2, 3, 2, 1, 2, 3};

В итоге получится ArrayIndexOutOfBoundsException

И ответим на ваш вопрос, как решить с помощью для каждого . Да, вы можете ввести внешний счетчик, но какой тогда в этом смысл?

public static boolean arrayOneTwoThree(int[] nums) {
    int i = 0;
    for (int num : nums) {
        //System.out.print(num);
        if (i < 2) continue; // we do not want ArrayIndexOutOfBoundsException happened, right?
        if (nums[i] == 3 && nums[num-1] == 2 && nums[num-2] == 1)
            return true;
    }
    return false;
}

Если вы будете sh использовать для каждого , вам следует избегать использования индексы должны быть согласованы. Там могут быть тонны разных решений. Вы можете использовать некоторые флаги или сохранить предыдущие и ранееПредыдущие:

    public static boolean arrayOneTwoThree(int[] nums) {
        int beforePrevious;
        int previous = 0;
        int current = 0;
        for (int num : nums) {
            //System.out.print(num);
            beforePrevious = previous;
            previous = current;
            current = num;
            if (current == 3 && previous == 2 && beforePrevious == 1)
                return true;
        }
        return false;
    }

Осторожно: это только первая мысль, поэтому это решение может быть неоптимальным и далеко не идеальным, возможно, вы можете добиться большего.

0 голосов
/ 09 марта 2020

Если вы хотите сравнить n вспомогательных элементов массива, вы должны использовать al oop, заканчивающийся на длину - n - 1: в вашем случае n = 3, поэтому ваш метод можно записать так:

private static boolean arrayOneTwoThree(int[] array) {
    final int n = array.length;
    if (n < 3) { return false; } //<-- for arrays with less than 3 elements
    for (int i = 0; i < n - 2; ++i) {
        if (array[i] == 1 && array[i + 1] == 2 && array[i + 2] == 3) {
            return true;
        }
    }
    return false;
}
...