Coding Problem 11

Muy buenas a todas y todos, seguimos con nuestros Coding Problems.


Enunciado:


Tienes dos listas de números no vacías, representando 2 números no negativos. Los dígitos están almacenados en orden inverso y cada uno de los nodos de las listas contiene un solo digito. Suma los dos números y devuelve el resultado como una lista.


Ejemplo:


Input: [2, 4, 3] + [5, 6, 4]

Output: [7, 0, 8]


Porque: 342 + 465 = 807




Solución:


Primero los tests a esta solución, usaré un test simple y luego el test del ejemplo.

public class ProblemTest {

    @Test
    public void shouldReturnCorrectSumWithSimpleNumbers() {
        List<Integer> number1 = new ArrayList<>();
        number1.add(1);
        number1.add(2);
        number1.add(3);
        List<Integer> number2 = new ArrayList<>();
        number2.add(3);
        number2.add(2);
        number2.add(1);

        List<Integer> resultExpected = List.of(4, 4, 4);

        assertEquals(resultExpected, Problem.addNumbers(number1, number2));
    }

    @Test
    public void shouldReturnCorrectSumWithComplexNumbers() {
        List<Integer> number1 = new ArrayList<>();
        number1.add(2);
        number1.add(4);
        number1.add(3);
        List<Integer> number2 = new ArrayList<>();
        number2.add(5);
        number2.add(6);
        number2.add(4);

        List<Integer> resultExpected = List.of(7, 0, 8);

        assertEquals(resultExpected, Problem.addNumbers(number1, number2));
    }
}

Y ahora la solución en código productivo:

public class Problem {
    public static List<Integer> addNumbers(List<Integer> numbers1, List<Integer> numbers2) {
        Collections.reverse(numbers1);
        Collections.reverse(numbers2);

        int oper1 = getNumber(numbers1);
        int oper2 = getNumber(numbers2);

        String result = Integer.toString(oper1 + oper2);

        int[]digits = result.chars().map(c -> c-'0').toArray();

        List<Integer> resultNumber = new ArrayList<>();

        for (int i = digits.length - 1; i >= 0; i--) {
            resultNumber.add(digits[i]);
        }

        return resultNumber;
    }

    private static int getNumber(List<Integer> numbers) {
        return Integer.parseInt(numbers.stream()
                .map(Object::toString)
                .reduce("", String::concat));
    }
}

¿Se te ocurre una mejor solución? Déjala en los comentarios o coméntamela por Twitter o Linkedin.


Espero que te haya gustado, nos vemos en la próxima :)

©2020 por Juanma Perez.