Если задан массив целых чисел, верните true, если последовательность чисел 1, 2, 3 где-то появляется в массиве - PullRequest
0 голосов
/ 25 сентября 2019

В основном я пытаюсь вернуть true, если 1, 2, 3 в указанном порядке находятся в массиве, я не могу понять, как это сделать, хотя.

Я уже пытался использовать некоторые для циклов for и if, но я не знаю, действительно ли это лучший способ сделать это

public static boolean arrayOneTwoThree(int[] nums) {
    for(int i = 0; i < nums.length - 2; i++) {
       if(nums[i] == 1 && nums[i + 1] == 2 && nums[i + i] == 3){
           return true;
       }
   }
   return false;
}

, он возвращает true только если 1s 2s и 3s находятся вмассив, который я хочу, чтобы он возвращал true только если 1,2,3 находятся в определенном порядке введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 25 сентября 2019
public boolean arrayOneTwoThree(int[] nums) {

    // variables declaration.
    boolean result = false;
    int counter = 0,index = 0;
    int arr[] = {1,2,3};

     // base condition check. like array length should not be less than 3.
    if(nums.length < 3){
         return result;
    }

    //for loop for iterating over array and finding desired pattern
    for(int i = 0; i < nums.length; i++){

        //pattern found in array
        if(counter == 3){
          result = true;
          return result;
        }

        if(nums[i] == arr[counter]){
             index++; 
             counter++;
        }
        else if(counter != 0){
             i = index-1;
             counter = 0;
        }
    }     
    if (counter == 3) {
        result = true;
        return result;
    }  
    return result;
}

Сложность этого решения O (n).

1 голос
/ 25 сентября 2019

В текущем коде есть много неправильных вещей.

  • Вы возвращаете true для каждого отдельного случая.
  • Вы создаете переменную result и никогда не делаетеничего с ним.
  • Вы создаете три цикла, когда можете использовать только один.
  • Вы никогда не проверяете, находятся ли значения рядом друг с другом.

Для первой проблемы мы будем return true только , когда 1, 2, 3 расположены рядом друг с другом, и return false; для КАЖДОГО другого случая.Это делается с помощью return false; после цикла.

Для следующей проблемы result не требуется, вам фактически не нужно ничего считать, поэтому удалите это.

Длятретья проблема, объединить все петли в один цикл.Однако нам нужно будет выполнить цикл с условием nums.length - 2 вместо length, потому что мы будем сравнивать 3 значения одновременно, и мы не хотим получать ArrayOutOfBoundsException.

Наконец, чтобы проверить, все ли значения находятся рядом друг с другом, просто сравните значения текущего индекса массива, следующего и двух значений индекса с 1, 2 и 3 соответственно.

Этобудет выглядеть как if (nums[i] == 1 && nums[i + 1] == 2 && nums[i + 2] == 3).Если это условие true, мы немедленно return true.

Вот как будет выглядеть код со всеми этими исправлениями:

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

    int [] arr2 = {3, 2, 3};
    System.out.println(arrayOneTwoThree(arr2));
}

public static boolean arrayOneTwoThree(int[] nums) {
    for(int i = 0; i < nums.length - 2; i++) {
       if(nums[i] == 1 && nums[i + 1] == 2 && nums[i + 2] == 3){
           return true;
       }
   }
   return false;
}

Тестовые прогоны:

true

false

Примечание: Удалите static из arrayOneTwoThree(int [] nums), если вам нужно его использоватьв контексте non-static я использовал static, чтобы проверить его из моего main.

...