Сжатие массива нулей и единиц

Задача

Написать программу, которая сжимает серии массива, состоящего из единиц и нулей по следующему принципу:

  • например, массив [0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1] преобразуется в [4,7,2,4] (т.к. начинается с нуля, то сразу записывается количество элементов первой серии);
  • а массив [1,1,1,0,0,0,0,0,0,0] преобразуется в [0,3,7] (т.к. первая серия - это единицы, то первый элемент преобразованного массива 0).

Решение

Сначала проверяем первый элемент массива. Если он единица, то в первую ячейку второго (преобразованного) массива записываем 0.

Начинаем перебирать исходный массив со второго элемента, сравнивая очередной элемент с предыдущим. Если они равны, то увеличиваем счетчик элементов серии (count). Как только они не равны, то записываем во второй массив значение count, присваиваем count единицу, увеличиваем на единицу счетчик второго массива (сдвигаемся в следующую ячейку).

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

Программа на языке Паскаль:

const N = 10;
var   
    a, b: array[1..N] of byte;
    i, j, count: byte;
begin
    randomize;
    for i:=1 to N do begin
        a[i] := random(2);
        write(a[i],' ');
    end;
    writeln;
    j := 1;
    if a[1] = 1 then begin
        b[j] := 0;
        j := j + 1;
    end;
    count := 1;
    for i:=2 to N do begin
        if a[i] = a[i-1] then
            count := count + 1
        else begin
            b[j] := count;
            count := 1;
            j := j + 1;
        end;
    end;
    b[j] := count;
    for i:=1 to j do
        write(b[i], ' ');
    writeln;
end.

Примеры выполнения кода:

1 1 1 0 0 0 1 0 1 1 
0 3 3 1 1 2 
0 0 0 0 0 1 0 1 1 1 
5 1 1 3 

Тема

Одномерные массивы

Уровень

Комбинированные задачи

Добавить комментарий