DEV Community

Johnnni
Johnnni

Posted on • Edited on

Desafios de algoritmo em PHP - problema#1.

Problema

Dada uma lista de números e um número k, retorne true caso existam dois números da lista que somados resultam em k.
Por exemplo, dada a lista [10, 15, 3, 7] e k = 17, o retorno deve ser true pois 10 + 7 é 17.

Resolução

Considerando que queremos achar dois números que somados resultam o mesmo valor de k, podemos considerar que temos uma expressão de soma simples, como abaixo:

k = a + b
Enter fullscreen mode Exit fullscreen mode

Essa expressão, pode ser reescrita como:

a - k = b
Enter fullscreen mode Exit fullscreen mode

Existem no PHP ao menos três formas de fazer isso, vou listar todas as três:

1 - A primeira e a que considero menos ideal é usar array_flip e transformar os valores em chaves, possibilitando o uso do isset em um foreach.

$array = array_flip([10, 15, 3, 7]);
$k = 25;
    foreach ($array as $key => $num) {
        if (isset($array[$k - $key])) {
        echo 'true';
        break;
    }
}
Enter fullscreen mode Exit fullscreen mode

2 - Podemos ainda usar o foreach com um in_array, sem necessidade do array_flip.

$array = [10, 15, 3, 7];
$k = 25;
foreach ($array as $key => $num) {
    if (in_array($k - $key, $array)) {
        echo 'true';
    }
}
Enter fullscreen mode Exit fullscreen mode

3 - Ou ainda usar uma função que faz uso de loops aninhados para verificar os valores.

/**
 * @param array $array
 * @param int $k
 * @return bool
 */
function twosum(array $array, int $k): bool
{
    foreach ($array as $key => $value) {
        foreach ($array as $key2 => $value2) {
            if ($value + $value2 == $k) {
                return true;
            }
        }
    }

    return false;
}

$array = [10, 15, 3, 7, 2];
$k = 17;
var_dump(twosum($array, $k));

Enter fullscreen mode Exit fullscreen mode

Top comments (0)