Вы молодой программист, живущий с двумя другими лучшими друзьями. Каждую неделю один из вас должен выполнять всю работу по дому, и вы решаете, чья это очередь, выбирая палку. Тот, кто выбирает самую короткую палку, проигрывает и выполняет всю работу по дому.
Поскольку вы все программисты и любите создавать головоломки, вы превратили «Выбери самую короткую палку» в компьютерную головоломку.
Вот правила головоломки.
- Вам будет предоставлена 2D-матрица, где каждый столбец представляет палку.
- В каждом столбце 1 представляет часть флешки, а 0 - пустое место
- При переходе сверху вниз в каждом столбце, изначально у вас есть
0
и, как только вы нажмете1
, палка запустилась, и остальная часть столбца будет заполнена1
только - Вы можете написать свою программу, чтобы выбрать один столбец. Размер палки в этом столбце определяет победителя / проигравшего. Размер флешки == количество единиц в этом столбце.
- Однако эта программа может иметь только линейную сложность времени наихудшего случая.
Поскольку вы все программисты, вы будете знать, снимает ли чужая программа ограничение по времени.
Ваша работа заключается в:
- Напишите программу или функцию, которая принимает входные данные в формате 2D или в виде массива строк.
- Ввод может быть взят из STDIN / prompt / console или аргумента функции.
- Если вы читаете входные данные из STDIN / приглашения, вы можете предположить, что чтение входных данных и преобразование их в массив занимает 0 раз (хотя код для этого должен присутствовать в вашем ответе)
- Определите колонку с самой длинной палкой в ней.
- Выход может быть возвращаемым значением функции или STDOUT / console / alert.
- Программа / функция должна иметь линейную сложность времени наихудшего случая,
O(m+n)
гдеm
есть количество строк иn
количество столбцов.
Ввод может быть одним из следующих форматов:
2D массив:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Массив строк:
[ "0000", "1000", "1101", "1111" ]
Вход будет иметь следующие свойства:
- Размер массива неизвестен, допустим прямоугольник любого размера
- В любом столбце, идущем сверху вниз, если вы видите 1, то все ниже будет одним
- Пустые-столбцы (т.е. 0-длина) палочки имеют допускается.
Это код-гольф, поэтому выигрывает самый короткий код ! *
Пожалуйста, объясните свой код или дайте неоправданную версию (чтобы проверить сложность времени) вместе с тем, какой из двух форматов ввода вы ожидаете.
ОБНОВЛЕНИЕ Под линейной временной сложностью здесь понимается O (n + m), где n - размер столбца, а m - размер строки. (Для тех, кому было непонятно)
ОБНОВЛЕНИЕ 2 Это определенно может быть сделано за линейное время. И если вы публикуете ответ, не стесняйтесь отложить публикацию логики / алгоритма на пару дней для честной борьбы :)
ОБНОВЛЕНИЕ 3 Я рассмотрю все ответы через пару часов, чтобы проверить сложность времени и программу :)
1
входной информацией является самая последняя ячейка, тогда необходимо прочитать весь ввод. Даже если стандартная библиотека языка подделывает произвольный доступ к стандартному вводу данных, под сценой он буферизует его, и поэтому требуется время Омега (n * m).