Skip to main content

Command Palette

Search for a command to run...

04/30 - 30 dias de HackerRank

Published
•2 min read•View as Markdown
04/30 - 30 dias de HackerRank

O desafio de hoje é um daqueles que a gente fica olhando um bom tempo, pensando "eu sei qual é o resultado, mas como chegar nele?"

Mini-Max Sum

Dados 5 números inteiros, determine o valor máximo e mínimo que pode ser calculado somando exatamente 4 dos 5 números. Imprima os resultados máximos e mínimos em uma linha separada por um espaço.

Exemplo:

\(arr = [ 1, 3, 5, 7, 9 ]\)

A menor soma possível é \(1 + 3 + 5 + 7 = 16\) e a maior é \(3 + 5 + 7 + 9 = 24\). Assim, o retorno da função deve ser 16 24.

A primeira coisa a fazer é organizar a array em ordem crescente. Fazendo isso, podemos garantir que os quatro primeiros itens serão os com os menores valores e os quatro últimos terão os maiores. Para isso, vamos usar o método sort().

function miniMaxSum(arr) {
  let sortedArr = arr.sort((a, b) => a - b);
}

Nessa função, comparamos o valor da variável a e da variável b e retornamos o menor valor das duas. Então, mesmo que tivermos uma variável desordenada, ela sempre será ordenada do menor pro maior.

Agora, o que precisa ser feito é somar os quatro primeiros elementos dessa array para pegar a menor soma e os quatro últimos elementos para pegar a soma maior.

E é nesse ponto que ficamos contemplando a nossa existência. Qual a melhor forma para fazer essa conta? Usar reduce? Um for? Uma soma manual?

img.gif

Acabei optando por usar o método slice() para pegar os valores e usar um laço for para iterar pela array. A soma desses valores, armazenei em variáveis chamadas minSum e maxSum, com a infinita criatividade que Deus me agraciou.

function miniMaxSum(arr) {
  let minSum = 0;
  let maxSum = 0;

  let sortedArr = arr.sort((a, b) => a - b);
  for (let i = 0; i < 4; i++) {
    minSum += sortedArr.slice(0, 4)[i]; //[ 1, 3, 5, 7 ]
    maxSum += sortedArr.slice(-4)[i]; //[ 3, 5, 7, 9 ]
  }

  return `${minSum} ${maxSum}`; //16 24
}

Usamos um for simples, principalmente para podermos referenciar o índice do elemento a ser somado (usando a variável i). A cada repetição do laço, adicionamos às variáveis minSum e maxSum o valor correspondente ao índice i da array cortada.

Outros métodos de array poderiam apresentar o mesmo resultado, porém esse método é o mais simples.

Agora é só rodar a suite de testes para verificar se a linha de raciocínio está correta.

image.png

Sucesso demais! 🎉

Até o próximo desafio!

More from this blog

Lucas Nabesima

22 posts