Member 13813150 Ответов: 2

Нажмите нули в конце


Учитывая случайный целочисленный массив, переместите все присутствующие нули в конец массива. Соответствующий порядок других элементов должен оставаться неизменным.
Изменение самого входного массива. Вам не нужно возвращать или печатать элементы. Не используйте дополнительный массив.
Примечание : вам нужно сделать это только в одном сканировании массива.
Входной формат :

Что я уже пробовал:

public class PushZerosAtEnd {
	
	public static void pushZerosAtEnd(int[] arr){
              int [] temp= new int[arr.length];
		      int i=0;
		      int k=0;
		      while(i<arr.length && k<temp.length){
		        if(arr[i]!=0){
		          temp[k]=arr[i];
		          i++;
		          k++;
		        }
		        else{
		          i++;
		        }
		      }
      for(int l=0;l<arr.length;l++){
       System.out.print(arr[l] + " ");
	}

	}
}


Я не знаю, почему это возвращает, в то время как отладка хороша

Richard MacCutchan

В вашем вопросе отсутствуют некоторые детали

CPallini

Я думаю, что вы не можете удовлетворить все требования.

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
Я не знаю, почему это возвращает, в то время как отладка хороша

Это невозможно, вы не можете получить правильный результат, потому что код неправильный.
Перечитайте свой код и обратите внимание на то, что вы делаете с ним. temp.

Ваше требование говорит:
Цитата:
Изменение самого входного массива. Вам не нужно возвращать или печатать элементы. Не используйте дополнительный массив.

но вы используете новый массив temp Попробуйте изменить свой код соответствующим образом, это не очень сложно.


Рейтинг:
0

Rick York

Это будет мой алгоритм :

for each n in array :
   if array[n] is zero then
      move all items in array after n forward
      set last item in array to zero  //(ie., array[last] = 0)
   endif
endfor
Функция memmove удобна для перемещения блоков памяти.


KarstenK

Он использует Java, поэтому он не может использовать memmove.

Rick York

Да, это похоже на java-код, но его вопрос имеет тег C++. Я бы предположил, что у него не должно быть этой метки. Как бы то ни было, memmove, конечно, не является обязательным требованием, но он устраняет необходимость в любых других обходах цикла. Конечно, с флагом или двумя и некоторым интеллектом требуется только один цикл, включая ходы.