Урок 23. Задача 2.

Урок 23. Задача 2.

Есть массив (пусть не более 10 элементов):

[0, 3, 2, 1, 0, 3, 2, 4, 0, -5]

Задача: перенести все нули в конец, так чтобы в итоге получилось:

[3, 2, 1, 3, 2, 4, -5, 0, 0, 0]

Решите со сложностью не более чем 2N

type arr_N = array[1..10] of integer;
var Arr :array [1..10] of integer = (0, 3, 2, 1, 0, 3, 2, 4, 0, -5);
    i, j, count :integer;
    U_arr :arr_N;

begin
  j := 1;
  count := 0;

  for i := 1 to high(Arr) do
    if Arr[i] = 0 then
      count += 1
    else
    begin
      U_arr[j] := Arr[i];
      j += 1;
    end;

  for i := 1 to high(U_arr) do
    write(U_arr[i], ' ');
    if count >= i then
    begin
      U_arr[i] := 0;
      write(U_arr[i], ' ');
    end;
  readln;
end. 
vedro-compota's picture

Решите со сложностью не более чем 2N (не заводя дополнительных массивов)

-- решите с этим условием

_____________
матфак вгу и остальная классика =)

var Arr :array [1..10] of integer = (0, 3, 2, 1, 0, 3, 2, 4, 0, -5);
    i, j, count :integer;
 
begin
  j := 1;  // для смещения в лево чисел отличных от нуля
  count := 0;  // количество нулей
 
  for i := 1 to high(Arr) do
    if Arr[i] <> 0 then
    begin
      Arr[j] := Arr[i];
      j += 1;
    end
    else
      count += 1;
 
  for i := 1 to high(Arr) do
    if i <= (high(Arr) - count) then
      write(Arr[i], ' ')
    else
      write(0, ' ');
  readln;
end. 
vedro-compota's picture

  • 1) Не надо записывать массив сам "на себя" в ситуации когда нулей в массиве нет
  • 2) Массив должен получить вид как по условию

_____________
матфак вгу и остальная классика =)

type nar = array [1..10] of integer;
var Arr :array [1..10] of integer = (0, 3, 2, 1, 0, 3, 2, 4, 0, -5);
    i :integer;
    Barr :nar;

function shift(ct :integer; var Barr :nar) :nar;
var i :integer;
begin
  for i := ct to high(Barr) - 1 do
    Barr[i] := Barr[i + 1];
  Barr[i + 1] := 0;
  shift := Barr;
end;

begin
  for i := 1 to 10 do
    Barr[i] := Arr[i];

  for i := 1 to high(Barr) do
    if Barr[i] = 0 then
    begin
      Barr := shift(i, Barr);
    end;

  for i := 1 to high(Barr) do
    write(Barr[i], ' ');
  readln;
end.   
vedro-compota's picture

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

_____________
матфак вгу и остальная классика =)

var Arr :array [1..10] of integer = (0, 3, 2, 1, 0, 3, 2, 4, 0, -5);
    i, count :integer;
  
begin
  count := 0;  // количество нулей
  for i := 1 to high(Arr) do
    if Arr[i] = 0 then
      count += 1
    else
      if count > 0 then 
         Arr[i - count] := Arr[i];
    
  for i := 1 to high(Arr) do
  begin
    if i > (high(Arr) - count) then
      Arr[i] := 0;
    write(Arr[i], ' ');
  end;
  readln();
end.
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)