удалите целевой элемент в массиве с помощью двух указателей-индекс не привязан?

#java #arrays

Вопрос:

Я пытаюсь удалить целевой элемент из массива , если ввод [3,3,2,2,3,3], а моя цель-3, я должен получить [2,2]. логика проста, используя медленные и быстрые указатели, и если нам нужно скопировать, переместите медленный указатель, в противном случае переместите быстрый указатель, чтобы пропустить цель .

но я продолжаю выводить индекс из связанной ошибки и не могу понять, почему ?

 public int[] removeElement(int[] input, int value) {  int slow = 0;  int fast = 0;  while (fast lt; input.length) {  while (input[fast] == value amp;amp; fast lt; input.length) {  fast  ;  }  input[slow  ] = input[fast  ];  }  return Arrays.copyOfRange(input, 0, slow); }  

Ответ №1:

Слишком много всего случается. Лучше всего видно в отладчике или на бумаге. Лучше не использовать внутри более сложных выражений.

Неудивительно, так как это можно сделать проще:

 public int[] removeElement(int[] input, int value) {  int slow = 0;  int fast = 0;  while (fast lt; input.length) {  if (input[fast] != value) {  input[slow  ] = input[fast];  }     fast;  }  return Arrays.copyOf(input, slow); }  

Ответ №2:

ваш массив : [3,3,2,2,3,3]
Первая проблема связана с этим:

 while (input[fast] == value amp;amp; fast lt; input.length) {  fast  ; }  

последний индекс равен 5 и меньше его размера(6) -gt; gt; fast -gt; сейчас fast=6
теперь на следующей итерации,
input[6]==value приведет к ошибке индексирования из-за границы.

Ответ №3:

я думаю, вам нужно поставить -1 за двумя входными данными.длина

это потому, что ввод.длина возвращает размер так, как думают люди (если есть одна запись, она возвращает 1), но если вы разговариваете с массивами, им это нужно компьютерным способом (начиная с 0).

подобный этому:

 public static int[] removeElement(int[] input, int value) {  int slow = 0;  int fast = 0;  while (fast lt; input.length-1) {  while (input[fast] == value amp;amp; fast lt; input.length-1) {  fast  ;  }  input[slow  ] = input[fast  ];  }  return Arrays.copyOfRange(input, 0, slow);  }