He visto una pequeña lista de problemas de programación relativamente simples que se utilizan para descartar candidatos, al igual que FizzBuzz. Estos son algunos de los problemas que he visto, en orden de dificultad creciente:
- Invertir una cuerda
- Invertir una oración ("a Bob le gustan los perros" -> "A los perros le gustan los perros")
- Encuentra el valor mínimo en una lista
- Encuentra el valor máximo en una lista
- Calcular un resto (dado un numerador y denominador)
- Devuelve valores distintos de una lista que incluya duplicados (es decir, "1 3 5 3 7 3 1 1 5" -> "1 3 5 7")
- Devuelve valores distintos y sus recuentos (es decir, la lista anterior se convierte en "1 (3) 3 (3) 5 (2) 7 (1)")
- Dada una cadena de expresiones (solo variables, + y -) y un conjunto de pares de variable / valor (es decir, a = 1, b = 7, c = 3, d = 14) devuelve el resultado de la expresión ("a + b + c -d "sería -3).
Estos eran para Java, y podría usar las bibliotecas estándar, por lo que algunas de ellas pueden ser extremadamente fáciles (como 6). Pero funcionan como FizzBuzz. Si tiene una pista sobre la programación, debería poder hacerlo con bastante rapidez. Incluso si no conoces bien el idioma, al menos deberías poder dar la idea de cómo hacer algo.
Al usar esta prueba, uno de mis jefes anteriores vio de todo, desde personas que lo superaron bastante rápido, hasta personas que podían hacerlo más rápido, hasta un tipo que no pudo responder ni una sola después de media hora.
También debo señalar: dejó que la gente usara su computadora mientras se les asignaban estas tareas. Se les indicó específicamente que podían usar Google y similares.
Quizás esto no responda directamente a su pregunta, pero no estoy seguro de que necesite plantear otro problema. Además de ser "fácil de memorizar", la pregunta de FizzBuzz es simplemente "fácil", y ese es el punto. Si la persona a la que está entrevistando pertenece a la clase de personas a las que FizzBuzz es "bien conocido", entonces pertenece a la clase de personas que una pregunta del tipo FizzBuzz no filtraría. Eso no significa que los contrate en el momento, pero sí significa que deberían poder pasar rápidamente y pasar al meollo de la entrevista.
Para decirlo de otra manera, vale la pena entrevistar más a cualquiera que se tome el tiempo de leer Coding Horror . Simplemente pídales que escriban la solución muy rápido, que la analicen brevemente (por ejemplo, ¿cómo se prueba esto?) Y luego pasen a la siguiente pregunta. Y como dice el artículo, "es realmente asombroso cuántos candidatos son incapaces de realizar las tareas de programación más simples".
fuente
Cualquiera de los primeros del Proyecto Euler probablemente sería bueno.
Por ejemplo:
fuente
Descubrí que revisar una cuerda si es un palíndromo es bastante simple y puede ser un desyerbador decente.
fuente
scalar(reverse 'foo') == 'foo'
.Quería una pregunta de FizzBuzz que no involucre al operador de módulo. Sobre todo porque suelo entrevistar a desarrolladores web para quienes el operador de módulo no aparece con tanta frecuencia. Y si no es algo con lo que te encuentres con regularidad, es una de esas cosas que buscas las pocas veces que lo necesitas.
(Por supuesto, es un concepto que, idealmente, debería haber encontrado en un curso de matemáticas en algún momento del camino, pero ese es un tema diferente).
Entonces, lo que se me ocurrió es lo que llamo, sin imaginación, Threes in Reverse . La instrucción es:
Hacerlo en orden normal es fácil: multiplique el índice de bucle por 3 hasta llegar a un número que exceda 200, luego salga. No tiene que preocuparse por cuántas iteraciones terminar después, simplemente continúe hasta que alcance el primer valor que es demasiado alto.
Pero yendo hacia atrás, hay que saber por dónde empezar. Algunos pueden darse cuenta intuitivamente de que 198 (3 * 66) es el múltiplo más alto de 3 y, como tal, codificar 66 en el ciclo. Otros pueden usar una operación matemática (división entera o un piso () en una división de punto flotante de 200 y 3) para calcular ese número y, al hacerlo, proporcionar algo más genéricamente aplicable.
Esencialmente, es el mismo tipo de problema que FizzBuzz (recorrer valores e imprimirlos, con un giro). Este es un problema para resolver que no usa nada tan (relativamente) esotérico como la operación de módulo.
fuente
print [x for x in xrange(3, 200, 3)][::-1]
Para algo realmente súper simple que se puede hacer en 10 segundos, pero eliminaría a las personas que literalmente no pueden programar nada , pruebe esto:
Esta no fue mi idea, pero se publicó en un comentario. por alguien llamado Jacob en una publicación de blog sobre la pregunta original de FizzBuzz.
Jacob continúa diciendo:
Hay una discusión más interesante después de ese comentario en la publicación del blog original sobre las formas de realizar este intercambio de variables sin requerir una tercera variable (sumar / restar, xor, etc.) y, por supuesto, si está utilizando un lenguaje que admite esto en una sola declaración / operación, puede que no sea una prueba tan buena.
Aunque no es mi idea, quería publicar esto aquí, ya que es una pregunta sencilla y elegante que puede (y debe) ser respondida en unos 10 segundos por alguien que haya escrito incluso el programa más simple. Tampoco requiere el uso de operadores aparentemente oscuros como el operador de módulo, con el que muchas personas, que por lo demás son programadores bastante decentes, simplemente no están familiarizadas (lo que sé por mi propia experiencia).
fuente
Fibonacci, invertir una cadena, contar el número de bits establecidos en un byte son otros comunes. Project Euler también tiene una gran colección de dificultad creciente.
fuente
Pídales que escriban una aplicación para devolver los factores de un número determinado. Es fácil de hacer y difícil de hacer bien en un corto período de tiempo. Puede ver su estilo y la forma en que resuelven los problemas en poco tiempo.
fuente
La implementación de strstr () requiere una comprensión básica del lenguaje al tiempo que brinda la oportunidad de una optimización inteligente.
fuente
Si se trata de una entrevista de C / C ++, asegúrese de que la persona conozca los consejos.
General: algoritmo simple (lista enlazada [simple / doble]). Preguntar sobre la complejidad de añadir en cada caso (al principio, al final, optimizaciones ...).
(General) ¿Cómo se encuentra el mínimo y el máximo de una matriz (tamaño N) con solo 3 * N / 2 comparaciones?
C / C ++: ¿Cómo optimizaría varios "strcat" en un búfer?
fuente
Consulte 6.14 de C ++ FAQ Lite:
http://www.parashift.com/c++-faq-lite/big-picture.html
fuente
Qué tal: quiero usar un solo entero para almacenar varios valores. Describe cómo funcionaría eso.
Si no tienen ni idea de las máscaras de bits y las operaciones, probablemente no puedan resolver otros problemas.
fuente
Encontrar una lista de números primos es una pregunta bastante común, pero aún requiere pensar un poco y hay diferentes grados de respuestas que la gente podría dar.
También se sorprendería de cuántas personas luchan por implementar una estructura de datos de tipo Mapa / Diccionario.
fuente
Les he pedido a mis candidatos que creen un programa para calcular el factorial de un número dado en cualquier pseudolenguaje de su elección. Es un problema bastante fácil de resolver y se presta bien a las preguntas de seguimiento naturales (que a menudo se pueden preguntar) sobre la recursividad.
fuente