ALLAN AVELAR
Boa Noite<!-- --> <username class="jsx-4090757678"></username><icon class="jsx-3111688975"><img alt="🍻" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAMAAABiM0N1AAAAclBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAD////rowDz8/MAAADUjAD/uQHl5eX9+e6oqKjs7Oz13qwoKCj+uADLy8s4ODjtrh71xVSPj4/lsUXy7N3ZmiBSUlJxcXHzzXblu2jlnQBCejIZAAAADHRSTlMACjIh2H/BoPb7PVsNNA6jAAAC5klEQVRYw+2YW5uCIBCGs/XYekSgzGNb//83LiAqwmDZ7mXfTerz+DYzMNNHh8NHH6n6+vZ8N4yyLApd3/v+epPiuRlTlAlF/NP19rOOQQYpCnaivCizKPJ2YBxfvnX9wRUiaUpQhX+u8qH/ct0k59wihiCMIz9Qe17qNdVvq26iPCFmr6crkZTgEMg2OFrqLJJCCkYBoitYN8cW0BlBFH6HbrxuaRynq7pBJL59sAYh4zVhgLWIrJsLkPhzolGkYkiiblEAg+DEYlhEJHi0gIiZWWxTytMzQ4pkanpMsV2YV2mr2GpmZAOU8iz0bS22I19+fck2QLEJmtrs2r+2ZFbQPD1q+uKaTalFZnucMUIoSep7r6ZGdhV7bA8kQEmSDw9K++chieXPAkdfsQUklNAnoPJqNhy/RzqonqoFc2gxzxMTlGUKKOEQOgwUioYWRcG+B5/XbWIHDXk+aIye3rukECA2qNZtAoNYvXt+tU4oEZpA6XrlYFDT950OKnQQWW1KGDRdiUjqmuqgcezsBNVsp/4LiN+VrNL/AmrKsvkTiEeyvP4HEI9kJ2jVIvPV+vVNENi074C0MfI+SB1sfwIto3YPCGiRxWPl09uvgvRx68iY8lmvgZD5azv60IdKyp+BjMG27KZyyA1diuKig/gzYNQqNqLsDFBykRwFlDC21W2J/c1Gj4bqkllLbFwyHgc0Nojbu5I+OpHi0D1oGTfLuyqnsTrSaOw43eilZZ0AqkvAiywd14pGme0Vt6EoLhuT05SxFcTXP6yQIQalGqqhsDuSB6NIOHYTlIqfxHsnUqy7O6sbD9YKOnijR9JQGLJbfFMbpsbo3fDWYpFihdtbmLWamZDmogUd5NY5K6ygw0AVwjZ76jgfIuHU0OjXt45bpwA4Cl0xUc0lwaM3enIadE5eIA95fuCpdeNWcKwb3K3vnU93nU7tdcv84xtn+KNetzA4vfuvwlI3N/BOzudvlo9W+gW3La50sq+F+QAAAABJRU5ErkJggg==" class="jsx-3111688975"/></icon>Seja bem vindo ao meu app!Instalar como aplicativo PWAInstalar em seu dispositivoAcesso RestritoEntrar / RegistrarBackoffice System (BOS)MyBankDados CadastraisProjetos / ServiçosDownloads / ProdutosCréditos / ComprasChromecast AppsEspaço de AcessosNotificaçõesDesconectarConteúdos disponíveisHomeSobre Mim3IntroduçãoResumo ProfissionalMetodologia de TrabalhoPortfólioPrincipais ProjetosFlex Network5IntroduçãoMineração PúblicaFlash TradingFlex TradingTutoriaisLaboratório7👨‍🎓MASTERCLASS🔮LOGOTYPES💰EASYBANK💘COOLPIDO💼EASYWORK💳EASYPAY📲YOU2APP🎁BRX💻MAINOSProdutos2🔮LOGOTYPES💰MY BANKInsightsHackerRank5Sock MerchantCounting ValleysRepeated StringJumping On CloudsLeft Rotation
EntrarRegistrarEsqueceu sua senha?EntrarNão tem uma conta? Crie uma agora!
🕓 Outubro 17, 2018🏎 5 minutos de leitura

Warm-up Challenges ⚡ Sock Merchant

Estou postando sobre as minhas respostas aos desafios do HackerRank como forma de melhorar meu aprendizado, reforçar meu conhecimento e estabelecer uma compreensão dos conceitos abordados. Se eu ajudar alguém ao longo do caminho, melhor ainda! Não afirmo que as respostas são as melhores ou mais eficientes, a menos que seja indicado o contrário. Elas são simplesmente as respostas que meu cérebro e minha intuição criaram para resolver o problema naquele momento.

Sock Merchant é um dos desafios iniciais com a dificuldade 'EASY'.


Qual o desafio?

John trabalha em uma loja de roupas. Ele tem uma grande pilha de meias que ele deve separar por cor para venda. Dada uma matriz de inteiros representando a cor de cada meia, determine quantos pares de meias com as cores correspondentes existem.

Por exemplo, há n = 7 meias com cores ar = 1, 2, 1, 2, 1, 3, 2. Há um par de cores 1 e um de cor 2. Existem três meias ímpares, uma de cada cor. O número de pares é 2.

O que temos que fazer?

Uma função que deve retornar um inteiro representando o número de pares correspondentes de meias disponíveis.

Parâmetros
  • n = o número de meias na pilha
  • ar = as cores de cada meia em uma matriz

Sample Input

9
10 20 20 10 10 30 50 10 20

Sample Output

3

Solução

function sockMerchant(n, ar) {

  let socks = {},
    count = 0,
    i = 0;
        
  for (i = 0; i < n; i++) {
    if (ar[i] in socks) {
      socks[ar[i]] += 1;
    } else {
      socks[ar[i]] = 1;
    }
  }

  Object.keys(socks).map(el => {
    count += ~~(socks[el] / 2);
  })

  return count;
}

Lógica

let socks = {},
  count = 0,
  i = 0;

Primeiro criei três variáveis; socks é um objeto que registro a contagem de cada tipo de meia; count para manter a contagem do número de pares de meias; i para iterar o forloop;

for loop

Criei um loop for que percorrerá a matriz de cores de meias. Vai iterar n vezes, que é a quantidade dada de meias na pilha. for (var i = 0; i < n; i++)

A condição if verifica se a cor existe em nosso objeto socks: if (ar[i] in socks)
Se existir, incremente a contagem dessa cor em um: socks[ar[i]] += 1;
Se não, crie uma chave com essa cor e a defina como 1. socks[ar[i]] = 1;

Depois que as meias foram contadas, configurarei um map no objeto socks, assim será separado para cada chave um elemento: Object.keys(socks).map(el => {

Em seguida, calculo o número de pares dividindo a quantidade de "meias" de uma cor socks[el] / 2 e depois aplico a resposta, dois tils (bitwise NOT).

Utilizei o bitwise NOT como um substituto para a Math.floor(), pois ele executa a mesma operação muito mais rápido 😎, como você pode ver em https://jsperf.com/jsfvsbitnot

Por último, finalizo a função retornando a contagem final. 🖖


🕵Soluções Extras

Outras Linguas que eu falo


💎 Ruby

def sockMerchant(n, ar)
  socks = Hash.new { | hash, key | Hash[key] = 0 }
  count = 0

  ar.each { | color | socks[color] += 1 }
  socks.each_value { | el | count += (el / 2) }

  count
end

🐍 PYTHON 2 & 3

def sockMerchant(n, ar):
  socks = collections.Counter(ar)
  count = 0

  for el in socks:
    count += socks[el] // 2
      
  return count

golang GOLANG

func sockMerchant(n int32, ar []int32) int32 {
  var count, i int32

  socks := make(map[int32]int32)
  for i = 0; i < n; i++ {
    socks[ar[i]]++
  }
  for _, el := range socks {
    count += (el / 2)
  }
  return count
}

scala SCALA

def sockMerchant(n: Int, ar: Array[Int]): Int = {
  val socks = ar.groupBy(c => c)
  val pairs = socks.map(el => el._2.length / 2)
  val count = pairs.sum
  return count;
}

javaJAVA 7 & 8

static int sockMerchant(int n, int[] ar) {
  HashSet<Integer> socks = new HashSet<Integer>();
  int count = 0;
          
  for (Integer i:ar) {
    if (socks.contains(i))
      socks.remove(i);
      count++;
    else
      socks.add(i);
  }
  return count;
}

php PHP

function sockMerchant($n, $ar) {
  $socks = array_count_values($ar);
  $count = 0;

  foreach ($socks as $el) {
    $count += intdiv($el, 2);
  }
  return $count;
}
Não afirmo que essas respostas são as melhores ou mais eficientes, elas são simplesmente as que meu cérebro e minha intuição criaram para resolver o problema naquele momento.
Sobre Mim Resumo Profissional Metodologia de Trabalho
Laboratório 💱 FLEX NETWORK | 🏭 👨‍🎓 MASTER CLASS | ⏳ 💰 EASY BANK | ⏳ 💼 EASYWORK | ⏳ 💳 EASY PAY | ⏳ 🎁 LOGOTYPES | 🏭 💘 COOLPIDO | ⏳ 📲 YOU 2 APP | 🏭 💻 MAINOS | 🏭 🎁 BRX | 🏭
Produtos 🔮 LOGOTYPES | 🏭 💰 MY BANK | 🏭
PRINCIPAIS PROJETOS
Insights HACKERRANK #sockMerchant #countingValleys #repeatedString #jumpingOnClouds #leftRotation
Fale Comigo
This PWA was handcrafted with ❤ using Reactjs ➕ Nextjs and deployed on Github 🚀
Conectando-se ao Chrome Cast...