Cómo resolver Two-Suma en Java


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);
    }
}

Related Articles

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Same Category

spot_img

Stay in touch!

Follow our Instagram