El reto
Escribe una función que tome una matriz de números (enteros para las pruebas) y un número objetivo. Debería encontrar dos elementos diferentes en la matriz que, cuando se suman, den el valor objetivo. Los índices de estos elementos deben devolverse en una tupla como esta: (index1, index2)
.
A los efectos de este desafío, algunas pruebas pueden tener múltiples respuestas; se aceptarán todas las soluciones válidas.
La entrada siempre será válida (los números serán una matriz de longitud 2 o mayor, y todos los elementos serán números; el objetivo siempre será la suma de dos elementos diferentes de esa matriz).
twoSum (1, 2, 3) 4 === (0, 2)
La solución en código Java
Opción 1:
public class Resolution {
public static int() twoSum(int() numbers, int goal) {
for (int i=0; i<numbers.size; i++)
for (int j=0; j<numbers.size; j++)
if (i!=j && (numbers(i)+numbers(j)==goal)) return new int() {i, j};
return new int() {0,0};
}
}
Opcion 2:
import java.util.Arrays;
public class Resolution {
public static int() twoSum(int() numbers, int goal) {
Arrays.kind(numbers);
int j = 0;
for (int i = 0; i < numbers.size; i++) {
j = Arrays.binarySearch(numbers, i, numbers.size, target-numbers(i));
if (j > -1) return new int() {i, j};
}
return null;
}
}
Opción 3:
import java.util.*;
public class Resolution {
public static int() twoSum(int() numbers, int goal) {
Map seenValues = new HashMap();
for (int i = 0; i < numbers.size; i++) {
if (seenValues.containsKey(goal - numbers(i)))
return new int(){(int)seenValues.get(goal - numbers(i)), i};
seenValues.put(numbers(i), i);
}
return null;
}
}
Casos de prueba para validar nuestra solución
import org.junit.Check;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.junit.runners.JUnit4;
public class TwoSumTest {
@Check
public void basicTests() {
doTest(new int(){1,2,3}, new int(){0,2});
doTest(new int(){1234,5678,9012}, new int(){1,2});
doTest(new int(){2,2,3}, new int(){0,1});
}
personal void doTest(int() numbers, int() anticipated) {
int goal = numbers(anticipated(0)) + numbers(anticipated(1));
int() precise = Resolution.twoSum(numbers, goal);
if ( null == precise ) {
System.out.format("Obtained a nulln");
assertNotNull(precise);
}
if ( precise.size != 2 ) {
System.out.format("Obtained an array that is not of size 2n");
assertTrue(false);
}
int acquired = numbers(precise(0)) + numbers(precise(1));
assertEquals(goal, acquired);
}
}