¿Cuáles son las mejores preguntas para la entrevista de programación que has hecho o que te han hecho?

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:

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:

  1. La competencia general del candidato con algoritmos, complejidad espacio / tiempo, etc.
  2. 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.
  3. 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.
  4. 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).
  5. 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 =).

Aquí están algunos de ellos de mi lista para entrevistas SDE / SDET:
SDE – Ingeniero de Desarrollo de Software
SDET – Ingeniero de Desarrollo de Software en Test

  1. Heap – Max Heaps y Min Heaps
  2. Conversiones: decimal, binario, hexagonal, octal (todas las demás combinaciones posibles)
  3. Conversión matricial de 90 grados
  4. Quick Sort + Aplicaciones
  5. Combinar Ordenar + Aplicaciones
  6. Eliminar duplicados en una cadena – En su lugar
  7. Invertir una cadena – Inplace
  8. Decidir si 2 cadenas son anagramas o no?
  9. Búsqueda binaria
  10. Invertir SLL sin utilizar ningún nodo extra
  11. Máxima matriz [algoritmo de Kadane]
  12. Encuentre un elemento que se repita más de n / 2 veces en un conjunto / conjunto dado. [Algoritmo de votación de Moores]
  13. Buscar y elemento en un arreglo ordenado binario girado
  14. Implementar la función de potencia sin función pow ()
  15. Verificar si la lista enlazada dada es circular / cíclica o acíclica. El seguimiento puede ser para indicar el punto de inicio del ciclo.
  16. Implementar cola de bloqueo
  17. Encuentra un par en la matriz que sume un número particular
  18. Invertir una lista de doble enlace
  19. Pares inversos en SLL. es decir, I / P: a-> b-> c-> d-> e-> f O / p: b-> a-> d-> c-> f-> e
  20. Segregar nodos pares e impares en una lista enlazada dada
  21. Adición de 2 listas enlazadas para separar una. (También aprende en el lugar)
  22. Convertir SLL en DLL (listas vinculadas basadas en XOR)
  23. Desplazar circular una matriz de la matriz de entrada de enteros por el número de elementos ‘k’
  24. Buscar un patrón dado en texto [Algoritmo de Rabin Karp]
  25. Implementaciones atio () e itoa () (ASCII a entero y Entero a ASCII)
  26. Semáforos binarios
  27. Generar subconjuntos de un conjunto dado de enteros
  28. Generar todas las permutaciones de una cadena dada
  29. Nivel de orden transversal
  30. Inorder sucesor de un nodo dado en BST (Árbol de búsqueda binario)
  31. Encuentre los elementos más grandes / pequeños de ‘k’ en una matriz dada (Sugerencia: puede usar montones)
  32. Heap Sort + aplicaciones
  33. Encuentre la subametría sin clasificar de longitud mínima en la que almacenarlos hace una matriz ordenada completa
  34. Buscar si existe un patrón dado en el texto de entrada utilizando matrices de sufijo
  35. Reorganice una cadena de modo que todos los mismos caracteres estén separados por ‘d’
  36. Problema de la gira de caballeros
  37. Rata en laberinto [seguimiento de espalda]
  38. Averigüe si dos rectángulos se superponen o no
  39. Encuentra el par de puntos más cercano en el plano dado
  40. Encuentra todos los subconjuntos de elementos en el conjunto dado cuya suma es igual a un objetivo dado
  41. Calcule x ^ y de manera tal que pueda funcionar para valores flotantes y negativos
  42. Encuentra la mediana de dos matrices ordenadas de entrada
  43. Encuentra el número total de ceros en un conjunto dado de 1 seguido de 0
  44. Encuentra si hay alguna sub matriz que suma cero
  45. Cuenta el número de inversiones en una matriz dada
  46. Encuentra el elemento mínimo en una matriz ordenada rotada
  47. Encuentra el punto fijo en la matriz dada
  48. Encuentra la suma máxima de la matriz secundaria [D&C]
  49. Número de incidencias de un número en la matriz ordenada
  50. Encuentre el elemento max y min en una matriz dada con un número mínimo de comparaciones
  51. Compruebe si un número es múltiplo de 3 o no?
  52. ¿Una función de línea para verificar si un número es potencia de 2 o no?
  53. Función para multiplicar un número por 7.
  54. Función para múltiples dos números sin usar * operador de producto
  55. Función para escribir series de Fibonacci de manera iterativa.
  56. Generar todos los números primos menores o iguales a n [Tamiz de Erastho ..]
  57. Dado un número, encuentra el siguiente número de palíndromo más grande
  58. Implementar la lógica para una moneda justa a partir de una moneda sesgada.
  59. Compruebe si un número es divisible por 7 sin mod operador
  60. Encuentra todas las palabras posibles desde el teclado de un teléfono.
  61. Lexicográfica tipo de permutación de todas las palabras.
  62. Baraja un array / baraja de cartas dado [Fisher Yates Algo]
  63. Algoritmo de muestreo de reservorio
  64. Seleccione ‘k’ elementos aleatorios de ‘n’ elementos
  65. Dado un número ‘n’. genera un triángulo pascal a partir de él.
  66. Escribir una función de precisión exponencial [serie de Taylor]
  67. Generar todos los factores primos de un número dado
  68. Generar todas las combinaciones posibles de elementos ‘r’ en un conjunto dado de tamaño ‘n’ [Función de distribución de probabilidad]
  69. Longitud de la secuencia secundaria más larga de la secuencia de números dada
  70. Encuentre la ruta de costo mínimo en una matriz de costo dada
  71. Número total de soluciones en un problema de cambio de moneda
  72. Encuentra el coeficiente binomial
  73. Problema de la bolsa de saco.
  74. Problema estándar de la gota de huevo
  75. Longitud de la secuencia palíndroma más larga
  76. Particionamiento Palíndromo
  77. Longitud máxima del par creciente en cadena
  78. Encuentra el medio de la lista enlazada dada
  79. Compruebe si una lista enlazada única dada es un palíndromo o no
  80. Insertar / Eliminar / Buscar en max heap
  81. Implementar el operador sizeof ()
  82. Encontrar el sucesor de BST dado
  83. Encuentra todos los triángulos triples en una matriz dada
  84. Encuentra el antepasado común más bajo de un nodo dado
  85. Devuelve un solo elemento eliminando todos los demás elementos con ‘k’ [Josefo]
  86. Dado un árbol binario sesgado clasificado, cree un BST fuera de él.
  87. Dada una matriz con enteros, salida todos los elementos que se repitieron exactamente dos veces
  88. Máxima profundidad / altura / diámetro de un árbol dado
  89. Serializar y des serializar un árbol binario dado
  90. Encuentre un solo número repetido o no repetido en la lista condicional. (XOR)
  91. Implementar “diff” en linux
  92. Programa para contar el número de bits establecidos en un entero dado.
  93. Convertir BST a una lista doblemente enlazada
  94. Convertir un entero en una cadena sin .toString ()
  95. GCD de dos numerales
  96. Dada una matriz en el recorrido posterior al pedido, verifique si la matriz dada está en BST o no
  97. Invertir las palabras en una oración inglesa dada
  98. Obtén la mediana de un flujo de grandes números.
  99. Imprime todos los caminos de un árbol binario dado desde la raíz a la hoja
  100. Modifique la matriz de modo que arr [i] == arr [arr [i]] Inplace
  101. Encuentra el número que falta en una lista de mil millones
  102. Además de poco

La mejor entrevista que he tenido fue una en la que me dieron una computadora portátil para que codificara algo desde cero en 3 horas y luego explicara mi diseño y solución al posible equipo frente a una pizarra.

El equipo pasó 2 horas criticando mi solución, discutiendo cómo mejorarla y ajustando los requisitos adicionales. La 6ª hora fue abierta cuestionada por mi futuro equipo.

Los entrevistadores descubren MUCHO sobre el candidato de esta manera. Un beneficio adicional para los entrevistadores es que más de la mitad de los candidatos no completan a tiempo o simplemente se dan por vencidos. El equipo de entrevistas desperdicia CERO tiempo en los rechazos. Esto permite al equipo de contratación aumentar enormemente la parte superior del embudo candidato .

Conseguí el trabajo, pero no lo acepté, sin embargo, excelente formato de entrevista.

Las pizarras blancas son para diseñar, no para codificar.

“Aquí dice que eres competente en C y C ++, ¿es correcto?”
“Sí, eso es lo que usé en bla bla bla de bla bla bla a bla bla bla”.
“¿Recuerdas malloc?”
“Sí, por supuesto.”
“Genial. Quiero que escribas malloc en la pizarra.
Me rei en voz alta. “¿En serio?”
Él también se rió. “¡Sí! Lo haremos gratis si tenemos tiempo”.
Cuando fui a la pizarra, dijo: “es posible que desee describir el diseño primero”.

Así que describí un montón y escribí un código para asignarlo. Me mantuvo ocupada por un buen rato y nos dio mucho de lo que hablar. Hay muchas decisiones que deben tomarse sobre qué optimizar y cómo hacerlo. De vez en cuando hablamos de cómo funcionaría free (), pero realmente no había tiempo para escribirlo en la pizarra (me pregunto cuántos de sus candidatos llegaron tan lejos).

El elemento sorpresa al principio es parte de lo que lo convierte en una pregunta tan grande. Mi primer pensamiento fue “eso es absurdo”, y cuando me reí, él también se rió. Así que eso rompió el hielo, nos puso de buen humor y ayudó a que todo fuera divertido.

Una de las cosas buenas de esta pregunta de la entrevista es que una vez que bosqueja los conceptos centrales, puede pasar una hora explorando los detalles, las ventajas y desventajas asociadas con hacerlo de una manera en comparación con otra, y así sucesivamente. Es solo una conversación continua. Y es una conversación unilateral, y lo digo de buena manera.

Las entrevistas de programación son a menudo una serie de pequeños rompecabezas, cada uno completamente sin relación, cada uno de los cuales requiere tiempo para explicar. Cuando el entrevistador está hablando, no están aprendiendo mucho sobre el entrevistado. Con este enfoque, el entrevistador pierde muy poco tiempo hablando. Las preguntas del entrevistador fueron muy breves, porque ambos sabemos lo que hace Malloc, así que pasó casi todo el tiempo escuchando, y eso es lo que hace que sea una buena pregunta.

¿Te gustaría sentarte y programar conmigo por un tiempo?

Cuando estoy entrevistando, no me importa si alguien puede resolver acertijos. Los estoy contratando para hacer cosas para nuestros usuarios, no para completar las pruebas de Mensa.

Si me siento y programo con ellos durante algunas horas, aprendo muchas cosas, entre ellas:

  • si han hecho mucha codificación recientemente,
  • que tan familiarizados están con el lenguaje,
  • cómo piensan acerca de la codificación,
  • lo bien que trabajan con los demás,
  • si hacen las preguntas correctas sobre una tarea,
  • cómo manejan los contratiempos,
  • si están inclinados a la mierda,
  • lo buenos que son en las pruebas automatizadas, y
  • Si revisan su trabajo.

A diferencia de las preguntas de la entrevista, para las cuales las personas pueden prepararse, esto es prácticamente imposible de falsificar. Si les va bien en la entrevista de programación en pareja, las probabilidades son muy buenas y les irá bien en el trabajo.

Impresioname … Cuéntame sobre el proyecto más desafiante en el que has trabajado en tu carrera. (en términos que un no programador / persona de negocios entendería)

  • ¿Cómo lo resolviste?
  • ¿Cómo te coordinaste con otros miembros del equipo y los interesados?
  • ¿Qué aprendiste de ello?
  • Si tuvieras que hacerlo otra vez, ¿qué habrías cambiado?

Esta pregunta trasciende los idiomas, permite que alguien hable sobre algo con lo que esté familiarizado (en lugar de preguntarle si sabe acerca de X, la tecnología Y o la palabra de moda). .. Y realmente llega al corazón de cómo alguien piensa, analiza problemas complicados y se comunica y colabora con otros miembros del equipo.

Las balas son solo “puntos de discusión” … por lo general (si la persona es buena) habrá muchas oportunidades para hacer preguntas aclaratorias y permitir que la discusión vaya en cualquier dirección. (A menudo entra en su “Proceso”, cómo tratan con la “gestión” / “plazos” / “el negocio”, …)

Cualquier persona que valga la pena debe tener al menos una “historia de guerra”, y les brinda un foro abierto para comunicar su “estilo” en lugar de seguir el:
“asinine-formulaic-buzzword-laundry-list-mind-puzzling-one-solution- type-questions … lo que generalmente significa que los entrevistadores están desconectados y pueden estar buscando” gruñidos de codificación “, no individuos inteligentes y críticos que piensan libremente. Haría grandes compañeros.

Recuerdo que en una de las entrevistas que había dado como más fresca … me pidieron que escribiera algo para

Calcula el ángulo entre el minuto y la manecilla de las horas de un reloj .

Al ser más fresco, no estaba tan mal con los algoritmos y la lógica, así que pude escribir algo muy rápidamente. El entrevistador cogió el papel en el que había escrito el algo y le dio una sonrisa.

Luego me pidió que secara el algoritmo por un tiempo de 3:30; a lo que rápidamente le hice pasar el código con 3 (horas) 30 (minutos) y mi algoritmo devolvió un ángulo de 90 grados. (¡Oh sí! Me dije a mí mismo)

Luego me pidió que me quitara el reloj y fijara la hora a las 3:30 y ¡ mierda santa ! No era 90 … era un ángulo agudo … Un poco menos de 90

PD: no fui seleccionado. Me uní a una startup unas semanas más tarde y volví a intentarlo en la misma empresa después de 2 años y luego fui seleccionado. 🙂

Para aquellos interesados ​​en la solución, miren esto – Problema del ángulo del reloj

No programando per se, pero creo que este es el mejor que he escuchado:

“¿Qué sucede cuando escribe http://www.google.com en la barra de direcciones de un navegador web y presiona Intro? Tiene 45 minutos, vaya tan profundo como desee con su explicación”.

Una persona con un conocimiento realmente profundo sobre el tema puede hablar durante horas sobre todo el proceso, pasando por APIs, llamadas de sistema, llamadas de red, enrutamiento, conmutación, servidores web … incluso electrónica y física de partículas si el tiempo y el conocimiento lo permiten.

Es una gran pregunta para entender el proceso de pensamiento de un candidato, su conocimiento sobre todas esas áreas, qué tan geeks son, qué suposiciones les gusta hacer y cuál es su verdadera zona de confort: un ingeniero de redes puede centrarse en el enrutamiento y el cambio, un programador puede centrarse en las API, un administrador de sistemas puede centrarse en las llamadas del sistema y los servidores web … y un candidato realmente bueno puede consumir los 45 minutos completos, pero el primer paquete de red ni siquiera ha llegado al servidor de destino.

Revisa algunas entrevistas de preguntas y respuestas que publicamos en Toptal:

  • Grandes preguntas de la entrevista de Java
  • Grandes preguntas de la entrevista de JavaScript
  • Grandes preguntas de la entrevista de Python
  • Grandes preguntas de la entrevista de PHP
  • Grandes preguntas de la entrevista de Ruby
  • Grandes preguntas de la entrevista de SQL

Están reunidos por los mejores desarrolladores para los mejores.

Las entrevistas técnicas son difíciles de hacer bien. Como entrevistador, solo puede pasar una o dos horas con el candidato y espera comprender su nivel de destreza y cómo será trabajar con ellos en los próximos años. Como entrevistado, solo tiene unas pocas horas para demostrar a los entrevistadores que posee las habilidades y que será una adición valiosa para su equipo, mientras que al mismo tiempo trata de averiguar si realmente desea unirse a su equipo.

Como entrevistador, comencé a enviar a los candidatos una “prueba para llevar a casa” después de la pantalla del teléfono, pero antes de la entrevista en persona. Prepararé un problema de programación que cubre algunos temas técnicos diferentes relevantes para nuestros proyectos, pero no debería tomar más de un par de horas para que lo complete un desarrollador experto. El candidato puede tomar todo el tiempo que desee y enviar su solución en el idioma que desee siempre que incluya un archivo “readme” que me indique cómo compilarlo y realizar las pruebas.

En realidad, el contenido del archivo Léame es una parte importante de la evaluación: si alguien envía un Léame de una línea que no me da la información que necesito, es una bandera roja; Si alguien envía un archivo Léame bien organizado que explique todo claramente y demuestre que lo ha pensado, es una gran bandera verde.

Leer su código me dice mucho más sobre la habilidad y el estilo de programación del candidato que una sesión de programación en la pizarra de una hora de duración. Si la solución se ve bien, invitaremos al candidato a una entrevista cara a cara y luego analizaremos algunas de las decisiones que tomaron en la prueba para llevar a casa y también haremos algunos ejercicios de codificación cortos para ver cómo pensar en sus pies

En general, creo que las mejores entrevistas son aquellas en las que le pide al candidato que haga el trabajo tanto como sea posible en el tiempo limitado disponible. Los enigmas son divertidos, pero no son una buena manera de evaluar cómo alguien va a hacer el trabajo. Entrevistas de programación en pareja han sido algunas de las entrevistas más valiosas en las que he participado.

Me hicieron esta pregunta cuando me presenté como interno para una MNC bien reputada.
Problema: dada una matriz de enteros de 1 GB de tamaño, ¿averigua los 10,000 números máximos de la matriz?

* esta pregunta fue formulada por uno de mis amigos justo antes de la entrevista y él me había dicho la respuesta. Además, no estaba listo para la entrevista porque no he estudiado tan bien. Pero de alguna manera logré despejar la primera ronda y pedí la segunda ronda. (Hubo 3 rondas).

Tan pronto como escuché esta pregunta, una gran sonrisa apareció en mi cara, pero de alguna manera me las arreglé para no sonreír frente al entrevistador. Mi mente izquierda me sugirió que le dijera al entrevistador que conozco la respuesta, pero mi mente derecha funcionó y pensé que debía actuar como si me acercara a la respuesta. Eso sería genial.

Asi que,
Yo: Bueno, el método de fuerza bruta es ordenar la matriz y tomar los primeros 10k elementos. Podemos usar la combinación de ordenación. Tomará O (n * logn) tiempo. (Actuando como si ni siquiera tuviera una pista de esta pregunta).

Entrevistador: Buena manera de empezar. Pero, ¿usarás la combinación de orden?

Yo: No, la ordenación rápida es mejor que la ordenación por fusión. Entonces, ¿deberíamos usar ordenamiento rápido?

Entrevistador: ¿Qué tan rápido es mejor el ordenamiento que el ordenamiento por fusión?

Yo: Bueno, el tiempo promedio para la ordenación rápida es n * logn y no ocupa espacio auxiliar, mientras que la ordenación combinada tomará espacio auxiliar de O (n). Por lo tanto, la clasificación rápida es cualquier día mejor que la combinación de ordenación.

Entrevistador: Impresionante. Pero, quiero más que eso.

* Como la entrevista fue para el interno, supongo que estaba lo suficientemente satisfecho como para hacer otra pregunta si no hubiera dicho la solución.

Yo: (Actuando como si estuviera pensando durante 5 minutos y después de 5 minutos pensé que debería decirle la respuesta de lo que es demasiado tarde). Podemos hacerlo usando un montón.

Entrevistador: Bien hecho, ¿cómo?

Yo: Haremos un min-heap a partir de los primeros 10k elementos e iteraremos a través de nuestra matriz original. Si encontramos un elemento mayor que el elemento mínimo, eliminaremos el elemento mínimo del montón e introduciremos nuestro nuevo elemento al montón.

Entrevistador: Muy bien hecho. ¿Cuánto tiempo tomaría?

Yo: O (k * logn). O (k) para hacer el montón y O (logn) para eliminar un elemento del montón. k = 10k aquí.
(Aunque lo engañé, pero era lo suficientemente inteligente como para calcular estas órdenes: P)

Entrevistador: Hacer un montón llevará tiempo O (k) con k elementos. ¿No debería llevar O (k * logk) tiempo para heapificar e insertar el elemento?

Yo: (bueno, esta vez he estudiado esto en las conferencias de Naveen Garg: P) y probé cómo le tomaría tiempo a O (k).

Entrevistador: Impresionante. Muy bien acercado. (y luego lanzó la siguiente pregunta). ¿Cómo encontramos el número de ceros finales en un factorial?

Yo: (Esto se enseñó cuando me estaba preparando para el IIT en matemáticas y era como hoy es mi día: p, pero esta vez le dije la verdad de que lo sabía). La solución es encontrar a Gint (n / 5) + Gint (n / 5 ^ 2)… … . . . hasta que Gint (n / 5 ^ k) se convierte en cero.

Entrevistador: Ok.
* Luego hizo 2 preguntas más. Una fue muy fácil que ni siquiera vale la pena escribir aquí. La otra pregunta era ¿Cómo encontramos si un árbol binario es un árbol de búsqueda binario?

Le dije el método Inorder-transversal . Pero me dijo que pensara en el método recursivo. Escribí una solución recursiva para él y me dijo que fallaría en algunos casos de prueba. Me dijo que escribiera ese caso solamente. Lo escribí tan pronto como me lo dijo. (Él me apreciaba como probablemente nadie hasta ahora hizo ese caso de prueba).

Y lo hice a tercera ronda. Entonces pensé que si te dan un problema en una entrevista, no importa si lo haces o no, solo verán cómo enfocas el problema.

EDITAR: La complejidad de la solución para la primera pregunta es O (n * logk), porque O (k) -> para hacer el montón.
O ((nk) * logk) -> para los elementos restantes (nk) que se pueden eliminar con el registro de complejidad de tiempo (k)

Corrígeme si estoy equivocado.

PS: Me hicieron demasiadas preguntas de GeeksforGeeks, un portal informático para geeks. Como no estaba preparado, no pude responder esas preguntas. Voy a escribir la historia de la tercera entrevista pronto. 😛

Mi respuesta hace eco y proporciona una alternativa a lo que dijo William Pietri.

¡Tampoco me importa si alguien puede resolver acertijos o aha! preguntas No me dicen mucho sobre la persona que no sea que probablemente hayan estudiado las preguntas de la entrevista o que realmente les gusten los enigmas. Lo que quiero ver es si alguien sabe qué diablos están haciendo para resolver un problema y escribir un código para resolverlo con una base de código existente. Ahora les pido a los candidatos que diseñen una función y la implementen para un proyecto de código abierto que empecé con un pretensor así, pero de dónde era el candidato: http://justinsa.github.io/card-u… . No hay límite en lo que el candidato puede enviar. Los únicos dos pasos que pido es que: (1) escriben una breve explicación de lo que planean implementar para que pueda proporcionar comentarios, y (2) bifurquen y presenten un RP para el producto final para que yo y otros puedan suministre realimentación.

Esto es lo que estoy tratando de entender sobre el candidato de esta pregunta / proceso:

  • ¿A qué gravitan para las características? UI? ¿Infraestructura? ¿Prueba? ¿Análisis estático? ¿Estampación? ¿Funcionalidad? El candidato puede hacer lo que quiera con este proyecto para nivelarlo. Las personas tienden a gravitar hacia un área que disfrutan o piensan que será interesante aprender cuando se les dé la oportunidad.
  • ¿Qué desarrollan como código de producto? Ya eligieron la característica. Ahora lo implementan y logran mostrar dónde son fuertes y menos fuertes y débiles. Cómo implementan es muy revelador en cuanto a lo que creen que significa tener un producto liberable. ¿Prueban? ¿Cómo se ponen a prueba? ¿Mejoran el trabajo existente para que sea más fácil / rápido de desarrollar en el futuro? ¿Son arquitectos pensativos o simplemente se meten en la basura de todos modos? ¿Reescriben todo porque lo quieren a su manera? Hay tantos comportamientos que surgen del producto de código real. Y nuevamente, las personas tienden a gravitar hacia un área que disfrutan cuando se les da la oportunidad y tienden a ignorar las áreas en las que tienen menos interés.
  • ¿Qué tan rápido van a hacer el trabajo y lo programan en su carga de trabajo existente? Tienes un trabajo (posiblemente) y tienes una vida con la que lidiar (definitivamente), ahora debes querer este trabajo lo suficiente como para ganar un poco de tiempo extracurricular solo para unirte a mi empresa. Pero lo que realmente aprendí es si está interesado en esta compañía y puede administrar su propio tiempo de manera efectiva para que las cosas sucedan cuando se les da una dirección casi nula y sin ayuda.
  • ¿Cómo te comunicas? El candidato está escribiendo una breve especificación, implementándola, idealmente verificando lo que implementó, y luego haciendo el trabajo de ida y vuelta conmigo mismo y con otros colegas durante la revisión de la especificación y la revisión del código para obtener su característica y código para mi maestro. Esto es en realidad lo que hacemos día a día, no hay simulación involucrada aquí, es el trabajo. ¿Qué tan bien escribe el candidato un correo electrónico y comunica sus ideas? ¿Cómo responden a la revisión de código feeedback? ¿Resuelven el desacuerdo o simplemente implementan lo que se les pide?

Solo empecé con esto hace aproximadamente un año y realmente me han gustado los resultados, ya que ha hecho entrevistas personales y por teléfono sobre la personalidad, la cultura y la conversación técnica sin la incomodidad de escribir el código en una pizarra o con alguien por encima del hombro. .

Una vez se le pidió a uno de mis amigos que escribiera un código para sumar dos números.

Esto puede parecer silencioso, una pregunta simple y estúpida, pero es una pregunta muy abierta.

El entrevistador no mencionó qué tipo de número. Es un espacio enorme de números negativos a números complejos, pero en pocas palabras, creo que el entrevistador estaba tratando de llegar a la medida en que la persona puede pensar dado un problema abierto como este, ¿cómo podría la persona seguir adelante para deducir cuál es el problema? problema que se supone que debe resolver.

Esto es lo que sucede cuando un administrador de proyecto o programa viene con un requisito de línea, incluso hoy parece que se resuelven sumando dos números. 🙂

Aparte de las preguntas normales de la entrevista de programación, he tenido las siguientes preguntas interesantes:

1) Diseño Facebook
2) ¿Qué búsqueda es eficiente Búsqueda binaria, Búsqueda ternaria, Búsqueda cuaternaria? Por qué ?
3) Probar P = NP;
4) Dada una impresión de entrada Int si es par o impar sin usar {if / else, ternary operator} debería ser solo una declaración printf que lo haga.
5) Imprime todas las combinaciones de una cadena sin usar recursión

Una vez me preguntaron cuál sería la mejor forma de comprobar si un personaje era ‘Y’ o ‘N’. Me dijeron que el caso no importaba. Dije que acabo de comprobar contra cada valor. El entrevistador me preguntó si estaba seguro, ¿qué hay de crear una cadena de “YN” y buscar la cadena para el personaje? Cuando entré en detalles acerca de cuán ineficiente sería configurar la llamada a la función de búsqueda de cadenas, me interrumpió y me recordó que era el 1 de abril y me dijo que ya tenía el trabajo.

Siempre le pregunto a la gente en qué han trabajado por diversión. Si nunca han escrito ningún código por diversión, probablemente no les apasiona su trabajo. Si lo han hecho, entonces escuchar cómo se relacionan los detalles de sus proyectos personales me dice mucho.

Pasé por un par de rondas de diferentes entrevistas tecnológicas durante mi último año en la universidad. En mi entrevista favorita, el entrevistador me pidió que describiera un problema técnico que había enfrentado en un proyecto en el que estaba trabajando. Cuando comencé a describirlo y cómo todavía hay muchos problemas que aún no había resuelto, se mostró más interesado y dijo: “Saben, tenía muchas preguntas que hacerle, pero hablemos de este problema específico. más porque esto es exactamente en lo que estuve trabajando durante mis primeras 2 semanas en esta empresa “.

Al principio pensé: “Mierda … ¡No tengo idea de cómo resolver esto! Por favor, no me preguntes ahora …” Pero no, juntos empezamos a abordar soluciones de lluvia de ideas. Y al final tuve una experiencia mucho mejor. ¡Incluso obtuve una idea de cómo abordar este problema en mi propia aplicación! Me sentí muy bien. Sin embargo, voy a comenzar a trabajar para esta compañía en la próxima semana, ¡y estoy súper emocionada!

No fue una pregunta de entrevista, sino más bien una evaluación. Pero me encantó y me pareció bastante relevante para la posición de contratación en Adobe en ese momento. Tuve la opción entre responder a cualquiera de estos:

  • Escribe una aplicación de arrastrar y soltar en JavaScript
  • Escribe un servidor web HTTP multi-hilo

Eso es. Sin detalles: tuve la total libertad de hacer cualquier elección de implementación que quisiera. Todo lo que se necesitaba era una justificación adecuada para mis elecciones de diseño. Tuve dos semanas de tiempo. Así que escribí un pequeño servidor de archivos, listados de directorios y archivos de transmisión, que admite un par de códigos de estado HTTP como 200, 404, 500, etc.

“¿Cuál es el error más difícil que has tenido que encontrar y solucionar?”

A lo largo de los años, esta ha sido mi pregunta técnica de entrevista más efectiva. Dentro de 5-10 minutos, y con algunas preguntas estratégicas de seguimiento, generalmente puedo descubrir lo siguiente:

  • ¿Qué tipo de problemas cree el candidato que son difíciles?
  • ¿Qué tan sólida es su reputación técnica? (¿Los problemas “insolubles” llegaron a su bandeja de entrada?)
  • ¿Es él un jugador de equipo? (¿Solo esfuerzo por resolver, o esfuerzo de equipo?)
  • Depuración de habilidades y tácticas.

He escuchado una gran variedad de respuestas a esta pregunta, que van desde el rastreo de las pérdidas de memoria (que no es un problema “difícil”, pero puede indicar un conjunto de herramientas deficiente), hasta el rastreo de las condiciones de carrera introducidas por el hardware defectuoso (definitivamente un ” difícil “problema”, a alguien que afirmó no haber corregido un error ya que no escribió el código de buggy (lo que hizo una entrevista muy corta).

Las preguntas de seguimiento suelen ser claves para hacer que esta pregunta funcione:

  • “¿Por qué fue tan difícil encontrar esa pérdida de memoria?”
  • “¿Por qué sospechaste del hardware? ¿Esa fue tu suposición inicial?”
  • “¿Cuánto tiempo se tardó en localizar el problema?”

Mi objetivo es contratar personas que puedan resolver los problemas imposibles, o al menos proponer algunos enfoques que ayuden a reducir el alcance y hacerlos más manejables.

Normalmente no hago preguntas de programación, si el candidato ha demostrado al menos alguna habilidad de programación. Por lo general, pediré ejemplos de código antes de la entrevista o veré lo que tienen en GitHub. Su estilo de programación * a menudo es muy indicativo de qué tipo de desarrolladores son.

En una de las empresas en las que trabajé, la calidad de los solicitantes era tan baja que comenzamos a pedirles que hicieran el ejercicio de FizzBuzz y les hablamos sobre eso. Si reclama tener una licenciatura en Ciencias de la Computación o similar, debe poder resolver esto. La mayoría no lo hizo, lo cual es impactante.

Si estoy contratando a desarrolladores senior, su currículum hablará por sí mismo y si estoy contratando a juniors, espero tener que entrenarlos en el trabajo, pero al menos debería estar familiarizado con lo básico.

Las cosas que pregunto son principalmente sobre su capacidad de razonar, o sobre su voluntad de aprender.

Mi pregunta favorita es “¿qué hay en tu lector de feeds” o (desde la muerte de Google Reader) “a quién sigues?” y “¿Cómo te mantienes al día?”. He contratado principalmente para los puestos de Ruby on Rails, así que espero que conozcas sobre Railscasts, Ruby Tapas, ¿quiénes son DHH y Tenderlove? Si dice que programa a Ruby, pero no tiene idea de lo que está pasando en la escena, eso me hace sospechar. Si no recibe ninguna actualización (Ruby Weekly, JavaScript Weekly, Hacker News, etc.), no espero que se mantenga al tanto de la velocidad con la que se mueve el entorno.

Otra cosa que me gusta hacer es preguntar sobre los patrones de diseño. Particularmente, a menudo le preguntaré si conoce la Ley de Deméter. Si no lo haces, te lo explicaré y conversaremos sobre lo que piensas al respecto. ¿Tiene sentido? ¿Es quizás demasiado estricto? ¿No deberíamos llamarlo “Ley”? ¿Porque?

Estas preguntas me dicen qué tan interesado está usted y cómo aborda la información nueva. ¿Incluso entiendes lo que haces? He visto a mucha gente fallar aquí.

Si la entrevista es exitosa, generalmente lo invitamos a una sesión en la que se empareja el programa con miembros de su futuro equipo, ya sea en nuestro código base real, o en algo que nos proporcione.

Por lo general, eso nos brinda una buena visión general de sus capacidades y, lo que es más importante, si usted es un ajuste cultural.

Odio los exámenes y las pruebas, ¿no las hago? Dejé eso atrás cuando salí de la universidad, así que tampoco voy a ponerte a prueba.

Hace mucho tiempo, cuando estaba comenzando mi carrera, un entrevistador (senior, unos 50 años) me preguntó si sabía algo sobre Xoops, www. xoops .org, en ese momento conocía algunas administraciones de contenido, pero nunca había oído hablar de xoops, así que lo gracioso es que en portugués “xoops” suena como chupar, y también es una jerga para hacer mamadas, ese fue el Los 45 segundos más incómodos de mi carrera. No sabía si era una pregunta seria o una “prueba de sofá”, estaba congelada y parecía confusa. Por suerte solo fue un malentendido y el entrevistador vio lo extraño que había sonado, se disculpó y le explicó lo que estaba preguntando.

Hoy somos grandes amigos y no necesitamos xoops.