Поиск самой длинной заданной последовательности в массиве
Задача
Код на Паскале ниже создает массив из двадцати элементов. Затем находит самую длинную последовательность из нулей и выводит на экран ее длину и номер ее начала в массиве.
Решение
Рассмотрим код программы.
Очевидно, нам требуются переменные для хранения размера самой длинной последовательности нулей массива (len_max) и номера первого элемента этой последовательности (start).
При просмотре массива находится очередная последовательность нулей. Ее длина должна быть сохранена для последующего сравнения с самой длинной последовательностью, найденной до этого. Поэтому вводится еще одна переменная для хранения длины текущей серии последовательных нулей (len_ser).
Всем трем переменным сначала присваивается 0. Что означает, что никаких искомых последовательностей в массиве нет.
Далее массив просматривается поэлементно (в цикле for).
Если значение очередного элемента равно нулю, то длина текущей серии увеличивается. Иначе (когда значение очередного элемента не равно нулю), необходимо проверить, что содержится в переменной len_ser. Если перед этим была серия из нулей и длина этой серии оказалась больше значения len_max, то требуется обновить значение len_max и вычислить значение начала текущей максимальной последовательности нулей (start).
Также нужно обнулить значение len_ser, независимо от того произошла перезаписьlen_max или нет. Ведь предыдущая последовательность все равно закончилась.
Во внешнюю ветку if вложена еще одна инструкция if (в которую вложена еще одна веткаif).
if i = n then if len_ser > len_max then begin len_max := len_ser; start := i - len_ser end
Этот код необходим для того, чтобы учитывать последний элемент. Если его значение 0, то обработка этой серии не будет завершена, т.к. ветка else уже не сработает. Поэтому его учет надо произвести отдельно.
Программа на языке Паскаль:
const n = 20; var arr: array[1..n] of 0..1; i, len_max, len_ser, start: byte; begin writeln('Массив: '); randomize; for i := 1 to n do begin arr[i] := random(2); write(arr[i]:2); end; writeln; len_max := 0; len_ser := 0; start := 0; for i := 1 to n do if arr[i] = 0 then begin len_ser := len_ser + 1; if i = n then if len_ser > len_max then begin len_max := len_ser; start := i - len_ser end end else begin if len_ser > len_max then begin len_max := len_ser; start := i - len_ser end; len_ser := 0 end; writeln('Длина максимальной серии: ',len_max); writeln('Начинается с ', start, '-й позиции'); readln end.
Комментарии
Если нужно определить самую…
Если нужно определить самую длинную серию одинаковых элементов и указать из каких элементов она состоит?
определить самую длинную серию одинаковых элементов
Ответ на Если нужно определить самую… от Гость (не проверено)
Такая же задача. Решение немного отличается
Найти в массиве самую длинную последовательность, состоящую из одинаковых элементов. Вывести на экран количество элементов самой длиной последовательности и номер элемента, который является ее началом.
Например, если массив выгдядит так:
0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0
, то количество элементов самой длинной последовательности, состоящей из одинаковых элементов, равно 5, а начинается она с 9-го элемента.
Количество подряд идущих четных
Посчитать максимальное количество подряд идущих четных элементов в целочисленном массиве длины 30.