¿Eres experto en Java? ahora te haremos la entrevista técnica …

¿Os suena? en todos los ámbito suele suceder esto, en el de la informática es una tónica general, gracias a Dios (y que siga así por mucho tiempo). El nivel de paro en el mundo de la informática es prácticamente 0. Según las encuestas es de un 4,5%, un “paro” que los expertos llaman “residual”, queriendo decir que hay pleno empleo en esta profesión.

Como muchos sabréis hay cientos de headhunters y recruiters, intentando fichar a los mejores para los puestos que necesitan cubrir, bombardeando el mail y el Linkedin con ofertas que más o menos cuadran con nuestro perfil, experiencia profesional y habilidades, con ellos se suele realizar una entrevista personal como primer filtro y más tarde, si todo ha ido bien, concretan una entrevista técnica. (Nada nuevo, ¿no?).

Pues bien, os voy a contar una experiencia personal, con fines divulgativos y de ayudar a quien esté empezando su carrera porfesional, intentando arrojar un poco de luz a ese mundo tan amplio de las entrevistas técnicas. (La imágen de Frankenstein me pareció graciosa y representativa). 🙂

Una tarde recibí por Linkedin un mensaje de la empresa X, en la que me decían que una vez visitado mi CV veían que les podía “servir” para formar parte de un apasionante proyecto internacional, y me animaban a realizar una entrevista técnica con ellos. Actualmente no estoy en búsqueda activa de empleo, y creerme que tengo más cosas interesantes que hacer una entrevista técnica, pero me llamó la atención que la entrevista técnica era en una plataforma novedosa y completamente desconocida para mi (https://www.codility.com/). Allí la empresa contratante había puesto una prueba que tendría que realizar. Con el afán de ver que “pinta” tenía el “challengy” que me proponían, me decidí a “cruzar la puerta” y apretar en el link.

Con los nervios del que no sabe que se va a encontrar, entré a la plataforma, me leí con cautela el tutorial, y con seguridad apreté “Estoy Listo para empezar”. Me indicaban que tenía 60 minutos para resolver los dos problemas, que ahora os expongo y desarrollo:

Os pongo el enunciado en Inglés, que para alguien no angloparlante siempre es una traba más:

Assignment 1:

When Mike gambles at the casino, he always uses a system that he devised himselfs. It is bases on always betting in one of 2 ways in each game:

  • betting exactly one chip
  • betting all-in

Wins in the casino are paid equal to the wager, so if he bets C chips and wins, he gets 2C chips back. If he loses, he doesnt get any chips back.
It was a very lucky day yesterday an Jhon won every game he playes, starting with one chip and leaving the casino wiht N chips. We also kno that Jhon played all-in no more than K times. Your task is to calculate the smallest possible number of rounds he could have played.

Given N = 8 and K =0 the answer is 7
Given N= 18 and K =2 the answer is 6

Write a funcition
Class Solution { public int solution(int N, int K); }

 

Esta fue la solución propuesta al assignment 1:

package test.tecnico;

import java.util.HashSet;

public class Bets {

    public static void main(String[] args) {

        System.out.println(solution(8, 0));
        System.out.println(solution(10, 0));
        System.out.println(solution(18, 2));

    }

    public static int solution(int N, int K) {

        if (K == 0) {
            return (N - 1);
        }

        HashSet<Integer> positions = numOfAllins(N, K);
        Integer chipCounter = 1;

        Integer numRounds = 0;

        while (chipCounter < N) {

            if (positions.contains(chipCounter)) {
                chipCounter = allIn(chipCounter);
            } else {
                chipCounter = singleBet(chipCounter);
            }

            numRounds++;

        }

        return numRounds;
    }

    private static Integer allIn(Integer chips) {

        return (chips * 2);
    }

    private static Integer singleBet(Integer chips) {

        return (chips + 1);
    }

    private static HashSet<Integer> numOfAllins(Integer ObjetiveChips, Integer maxNumber) {

        Integer allInChipValue = ObjetiveChips;
        Integer counter = 1;
        HashSet<Integer> allInNum = new HashSet<Integer>();
        while (allInChipValue >= 2) {

            allInChipValue = allInChipValue / 2;

            if (maxNumber >= counter) {
                allInNum.add(allInChipValue);
                counter++;
            }
        }

        return allInNum;
    }

}

 

 

Assignment 2:

Peter is a new assembly line manager ina shoe factory. So far, everything has been going very smoothy for her an N shoes of the same model and size have been produced. Exactly half of them are left shoes and the other half are right shoes.
The freshly sewn shoest are standing in a line, in no particular order. They now need to be matched into pairs and paked into boxes. Peter would like to assign this task to his subordinate workers. Each worker should get a distinct interval of adjacent shoes, such that the number of left shoes is equal to the number of right shoes. Each shoe must be assigned to exactly one worker.

Write a function:
class Solution {public int solution (String S);}

Given a string S of letters “L” and “R”, denoting the types of shoes in line (left or right), returns the maximun number of intervals such that interval contains an equal number of left and right shoes.

For example:

  • Given S = “RLRRLLRLRRLL” the function should return 4
  • Given S = “LLRLRLRLRLRLRR” the function should return 1.

 

Esta fue la solución propuesta al assignment 2:

package test.tecnico;

public class Shoes {

    public static void main(String[] args) {

        System.out.println(solution("RLRRLLRLRRLL"));
        System.out.println(solution("LLRLRLRLRLRLRR"));
        System.out.println(solution("RLRRLLRLRL"));

    }

    public static int solution(String S) {

        Integer l = 0;
        Integer r = 0;
        Integer chunck = 0;
        for (int i = 0; i < S.length(); i++) {

            if (S.charAt(i) == 'L') {
                l++;
            }

            if (S.charAt(i) == 'R') {
                r++;
            }

            if (l == r) {
                chunck++;
                l = 0;
                r = 0;
            }
        }

        return chunck;

    }
}

La estrategia que seguí …

  • No pasar al segundo (ni leerlo siquiera) hasta que no hubiera resuelto el primero o bien hubiera perdido la mitad del tiempo.
  • Lo mas importante es “perder“ tiempo en entender bien el enunciado, lo mas dificil es saber el “qué” no el “cómo”. Parece obvio, pero lo tengo que decir.
  • La plataforma tiene definidos test unitarios para la funcionalidad mínima, en la cual puedes añadir nuevos “test”, supongo que eso “sube nota” yo no hice ninguno nuevo (Mal hecho, los test nunca sobran).
  • Desarrollé la solución en un “Eclipse”, en el tutorial de incio te lo aconsejan, luego la copie y pegué, le di al botón de compilar, pasar test y cuando salió en “verde” subí la solución. Desde mi punto de vista, la interfaz es bonita e intuitiva, pero tiene la desventaja de no tener los “atajos de teclado” a los que todos estamos acostubrados.

Entiendo que Codility ofrecerá un informe exhaustivo del candidato a la empresa contratante, número de veces que ha leido el ejercicio, veces que ha puesto una solución … tiene que haber un sin fin de métricas para ayudar en el proceso de selección. La experiencia con la plataforma fue buena, supongo que tendrá diversos niveles de dificultad dependiendo del puesto a cubrir.

Para concluir, cuando realizaba este tipo de entrevistas siempre iba con el “miedo” de, “seguro que me preguntan lo que no sé”, o peor todavía, “seguro que me preguntan lo que no sé que no sé”. La experiencia y el tiempo me han enseñado que hay que verlo con otra perspectiva y cualquier problema es una oportunidad encubierta. Pensad que por muy mal que lo hagais, siempre aprenderéis algo nuevo. Nunca nada sale bien a la primera 🙂

5 thoughts on “¿Eres experto en Java? ahora te haremos la entrevista técnica …

  1. La primera es más sencilla, el planteamiento matemático consiste en dividir por dos si es par, si es impar es porque la última es una apuesta de 1C. Se divide tantas veces como K marque (cada resultado que sea impar es porque hubo una de 1C). cuando ya no hay más (K=0), entonces el resultado es sumar lo que queda menos 1. Puede hacerse recursivamente o iterativamente.

    1. Que nos lo aclare el autor, pero el all in tiene que ser siempre en el momento mas optimo y turururu, con la estrategia que planteas no lo cumples.

  2. para el que preguntaba por una aclaración, matemáticamente, las apuestas más óptimas 2C son las que más rédito obtienen, y que por tanto deben ser las últimas. Por ello se asume que partiendo de N y K :

    public int solution(int N, int K) {
    return (K==0)? N-1 : ((N mod 2 == 0)? solution(N/2, K-1)+1: solution(N-1,K))+1;
    }
    y así de cabeza, esa es la función que resuelve el problema, (¡¡Creo!!!). Aunque hace tiempo que no programo en java tal vez haya un error de tipos al dividir N por 2.

  3. Se me colo el último paréntesis en el comentario anterior 😉

    public int solution(int N, int K) {
    return (K==0)? N-1 : ((N mod 2 == 0)? solution(N/2, K-1)+1: solution(N-1,K)+1);
    }

Leave a Reply

Your email address will not be published. Required fields are marked *