Eres un geek de programación joven que vive con tus otros 2 mejores amigos. Cada semana, uno de ustedes tiene que hacer todas las tareas de la casa y usted decide de quién es el turno escogiendo un palo. El que elige el palo más corto pierde y hace todas las tareas.
Como todos ustedes son programadores y les encanta crear rompecabezas, han modificado el "Elija el palo más corto" en un rompecabezas de computadora.
Aquí están las reglas del rompecabezas.
- Se le dará una matriz 2D, donde cada columna representa un palo.
- En cada columna, 1 representa una porción del palo y 0 es un espacio vacío
- Al ir de arriba a abajo en cada columna, inicialmente tienes
0
una y tan pronto como tocas un1
, el palo ha comenzado y el resto de la columna se llenará con1
solo - Puede escribir su programa para elegir una columna. El tamaño del palo en esa columna determina el ganador / perdedor. Tamaño del palo == número de 1s en esa columna.
- Sin embargo, ese programa solo puede tener una complejidad lineal en el peor de los casos.
Como todos ustedes son programadores, sabrán si el programa de otra persona está disparando el límite de complejidad de tiempo.
Tu trabajo es:
- Escriba un programa o función que acepte entradas en formato 2D o en un conjunto de cadenas.
- La entrada se puede tomar de STDIN / prompt / console o un argumento de función.
- Si está leyendo la entrada de STDIN / prompt, entonces puede suponer que la lectura de la entrada y convertirla en una matriz lleva 0 tiempo (aunque el código para hacerlo debe estar allí en su respuesta)
- Determine la columna con el palo más largo.
- La salida puede ser el valor de retorno de la función o STDOUT / console / alert.
- El programa / función debe tener una complejidad lineal en el peor de los casos,
O(m+n)
dondem
es el número de filas yn
el número de columnas.
La entrada puede ser uno de los siguientes formatos:
Matriz 2D:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Matriz de cuerdas:
[ "0000", "1000", "1101", "1111" ]
La entrada tendrá las siguientes propiedades:
- El tamaño de la matriz es desconocido, suponga un rectángulo de cualquier tamaño
- En cualquier columna, de arriba hacia abajo, si ve un 1, todo lo que se muestra a continuación será uno
- Se permiten palos de columnas vacías (es decir, de longitud 0) .
Este es un código de golf, ¡el código más corto gana ! *
Explique su código o proporcione la versión no protegida (para verificar la complejidad del tiempo) junto con cuál de los dos formatos de entrada espera.
ACTUALIZACIÓN La complejidad del tiempo lineal aquí significa O (n + m) donde n es el tamaño de la columna ym es el tamaño de la fila. (Para aquellos que no estaban claros)
ACTUALIZACIÓN 2 Esto definitivamente se puede hacer en tiempo lineal. Y si está publicando una respuesta, siéntase libre de retrasar la publicación de la lógica / algoritmo por un par de días para una pelea justa :)
ACTUALIZACIÓN 3 Revisaré todas las respuestas en un par de horas para validar la complejidad del tiempo y el programa :)
1
en la entrada es la última celda. Es necesario leer toda la entrada. Incluso si la biblioteca estándar de un idioma falsifica el acceso aleatorio a stdin, debajo de las escenas lo está almacenando en búfer y, por lo tanto, el tiempo necesario es Omega (n * m).