schedule = ['11010100','01100000'] #original schedule
freehours = [day.strip('0').count('0') for day in schedule]
Алгоритм: преобразовать в строку типа '11010100', убрать 0 символов из начала и конца ('110101') и сосчитать 0 символов (2), которые остались. Описательно, что все периоды между первым и последним заполненным периодом, которые не заполнены, являются вашими свободными периодами.
Дополнительные гикиры:
Более эффективно, если вы работаете в C ++ с массивом логических значений: получите итератор для массива, запустите его через любые 0 значений в начале. Объявите другое и итерируйте в обратном направлении от конца по любым 0 значениям. Затем выполните итерацию начального итератора вперед, считая все нули до достижения конечного итератора.
Однако, если у вас был очень длинный список, может быть более эффективно выполнять итерацию вперед, сохраняя позицию последней 1 и добавляя размер каждого пробела к счетчику при встрече со следующим 1. Таким образом, память читается в смежных блоках, и суммирование может выполняться на потоковом входе, даже записывая текущие суммы в сокет.