Desde mi experiencia, las mejores preguntas de programación son las que tienen múltiples enfoques con diferentes compromisos. Observar a alguien abordar el mismo problema bajo diferentes restricciones puede enseñarle mucho sobre la actitud y las habilidades de la persona. Daré un ejemplo concreto y luego explicaré por qué creo que es una gran pregunta.
Problema * *: supongamos que tiene una lista de N + 1 enteros entre 1 y N. Sabe que hay al menos un duplicado, pero podría haber más. Por ejemplo, si N = 3, su lista puede ser 3, 1, 1, 3 o puede ser 1, 3, 2, 2. Imprima un número que aparezca en la lista más de una vez. (Es decir, en el primer ejemplo, puede imprimir ‘1’ o ‘3’, no tiene que imprimir ambos).
[Pausa aquí si quieres pensar en el problema porque estoy a punto de revelar la solución.]
Aquí hay una conversación idealizada:
- ¿Dónde puedo encontrar (los mejores diseñados) sitios web creados después de un curso de Codecademy?
- ¿Cuáles son algunos de los mejores recursos para las técnicas de entrenamiento de un cachorro?
- ¿Cuáles son las mejores aplicaciones de Android que utilizan iBeacon?
- ¿Cuál es el hecho de cricket más sorprendente que puedes compartir?
- ¿Qué compañía ofrece los mejores servicios de desarrollo de aplicaciones móviles en el norte de India?
Entrevistador : [problema de los estados]
Candidato : Bueno, supongo que el enfoque más obvio es comparar cada número de la lista con cada otro número hasta que encuentre un duplicado.
Entrevistador : Es un buen comienzo. ¿Cuáles son las complejidades de espacio y tiempo de esa solución?
Candidato : O (n ^ 2) tiempo y O (1) espacio.
Entrevistador : Genial. Bien, bueno, digamos que la lista es bastante grande, así que necesitas algo que sea más rápido que O (n ^ 2).
Candidato : Hm, creo que podría recorrer la lista y usar un hash para realizar un seguimiento de los valores que he visto hasta ahora. Una vez que me encuentro con un número que ya está en el hash, he terminado.
Entrevistador : es una buena idea, pero ¿debe ser un hash dado que todas las entradas son enteros entre 1 y N?
Candidato : Ah, supongo que podría usar una matriz booleana y usar los valores enteros como índices.
Entrevistador : ¿Cuáles son las complejidades de espacio y tiempo de esa solución?
Candidato : O (n) tiempo para iterar a través de la lista y O (n) espacio para la matriz / hash.
Entrevistador : Muy bien. Está bien, digamos que la lista de números es bastante grande, por lo que te gustaría evitar crear una copia. Tal vez tengas 8GB de RAM, y la lista ocupa 6GB.
Candidato : Bueno, podría ordenar los números y comparar los pares adyacentes. Eso tomaría O (n * log n) tiempo y O (1) espacio si utilizo una clasificación en el lugar como mergesort.
Entrevistador : Excelente. Apliquemos una restricción final: qué sucede si quieres algo más rápido que O (n ^ 2) y no puedes permitirte usar mucho espacio adicional, pero tampoco puedes manipular la lista original. Por ejemplo, tal vez la lista esté en un CD de solo lectura.
(Casi todos los candidatos necesitan una pista o dos en este punto ..)
Candidato : Creo que puedo buscar binario para un número duplicado. Por ejemplo, repaso la lista y cuento el número de enteros entre 1 y N / 2. Si el recuento es mayor que el número de enteros posibles en ese rango, entonces sé que hay un duplicado en ese rango. De lo contrario, debe existir un duplicado en el rango de N / 2 + 1 a N. Una vez que sepa en qué mitad del rango está el duplicado, puedo repetir y realizar una búsqueda binaria en ese medio, luego seguir repitiendo el proceso hasta que haya Encontró un número duplicado. La complejidad del tiempo es O (n * log n) y la complejidad del espacio es O (1).
Entrevistador : ¿Cuándo puedes empezar?
Preguntas como esta son geniales porque prueban muchas cosas al mismo tiempo:
- La competencia general del candidato con algoritmos, complejidad espacio / tiempo, etc.
- La capacidad del candidato para responder a diferentes restricciones y manejar diversas compensaciones . Esto es algo con lo que los ingenieros lidian todo el tiempo, y es una habilidad crítica para tener.
- La creatividad del candidato . Cada restricción obliga a una persona a comenzar desde cero y a pensar en un enfoque completamente nuevo: una gran prueba de creatividad.
- La actitud del candidato hacia la complejidad . Algunos candidatos se quedan atascados permanentemente porque comienzan tratando de encontrar la solución de espacio O (n * log n) de tiempo / O (1). Suponen que usar un hash o comparar todos los elementos de la lista con todos los demás elementos no es lo que estás buscando, por lo que no mencionan las soluciones fáciles (pero tampoco pueden encontrar las soluciones más difíciles). Esta es una bandera amarilla que el candidato tiende a complicar en exceso las cosas (por lo general, les pediré a los entrevistadores que vigilen esta tendencia).
- La pasión del candidato por el aprendizaje y los retos . Algunas personas se emocionan cuando se meten en restricciones cada vez más duras, otras se sienten abatidas y perezosas.
** Para otorgar crédito donde se debe el crédito, me hicieron esta pregunta durante una entrevista en Microsoft. Pensé que era una gran pregunta y la he estado usando desde entonces. Quora parece ser un buen lugar para retirar la pregunta y obligarme a pensar en algo más original =).