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 :)
129 vistas0 comentarios