Как реализовать функцию проверки наличия подряд идущих единиц в битовой строке
Что проверяют
Умение пройти строку за один проход и знание готовых средств Python. Задачу часто дают в двух вариантах: строка из символов '0' и '1' или целое число, и тогда ждут битовый трюк. Следом спрашивают про произвольное k и про самую длинную серию единиц.
Как отвечать
Покажите несколько решений и их цену:
- счётчик: один проход, при
'1'увеличиваем счётчик, при'0'сбрасываем, при достиженииkсразу возвращаемTrue. Время O(n), память O(1), ранний выход; - подстрока:
'1' * k in s. Поиск подстроки выполняется на C, на длинных строках это заметно быстрее цикла на Python, и читается в одну строку; - самая длинная серия:
max(map(len, s.split('0'))), дальше сравнить сk; - целое число, две единицы подряд:
n & (n >> 1) != 0. В Python сравнение связывает слабее, чем&, так что выражение верное, но скобки всё равно лучше поставить явно: в C и JavaScript приоритет обратный; - целое число,
kединиц: повторитьn &= n >> 1ровноk-1раз. Если после этогоnне ноль, серия длинойkесть; - валидация:
set(s) <= {'0', '1'}для строки,int(s, 2)броситValueErrorна мусоре. У строки изbin(n)не забудьте префикс0b.
Отдельно договоритесь о значении k <= 0: вернуть True или бросить ValueError. Молча вернуть False хуже всего, это противоречит смыслу вопроса.
Где спотыкаются
Не сбрасывают счётчик на нуле и фактически считают общее число единиц. Для '10101' и k = 3 такая функция вернёт True, хотя подряд идущих единиц там нет.
Не учитывают отрицательные числа. Целые в Python не ограничены по длине, -1 >> 1 остаётся -1, поэтому битовый трюк возвращает True для любого отрицательного. Нужна проверка n >= 0 или маска фиксированной ширины.
Сравнивают символ с числом: char == 1 вместо char == '1'. Условие всегда ложно, ошибки нет, и функция тихо возвращает False на любой строке. Ловится только тестами на граничные случаи: пустая строка, k больше длины, строка из одних единиц.