ALLAN AVELAR
Boa Tarde<!-- --> <username class="jsx-41964832"></username><icon class="jsx-3111688975"><img alt="🍜" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAMAAABiM0N1AAAAS1BMVEVHcEwAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAADoEiS7kWf/1nnrLDy1jWT5vsP40HXW1tbGxsYZGRlhYWGcnJzp6elKSkrDpFyEFbgAAAAACnRSTlMAGv//s3SKS/LOykLjcwAAAZRJREFUWMPtmOuOgyAQhRVRwMtWbtr3f9IVF2On9QKjNZvdnoT4Q/0CBzIzTJJ8hBKjnHhxyvCcggAVGAZB6QrQ/T6PQ6C6Hkb780SDqkF1PY9tXQE6bWlObTuPQx6FawP0Naiq5rGtqzz6g6AJBkHIcPQB7Yv7wHYYRKcjcBTEzgIl+VmghImTQH7nPqCnnRL8OTiEhBEucoBJxcJHgfFIpA+gJU5wYBMvJxAJIjmYUN9lCHUGTMn5LDOUpHMcbHaGFDgep4JKpN4H+n0eddmtaW7uVdwTgPgIasqycR9EPTtwjtzJVjiQBCfbJSCLW5odfqXgFmNwXhtw63GZTONAeviVwSytMBwFvD6wNgMs8lla4oIIAVfMMbTFg3oYaacp2ViOfZmQr2VUvNPAoTEhuY3TUTZJt/U8XayKdMSclF5Y2JyTbJQ/JF+/7vdBy5P9VkvA58l+d33KkPX5jD75QkIbK1fyZSet0b6A2Gh2pDS8a0DTgPIxoHLY7708tGpWq6LQFg4rqOBrlRUtDjSC/re+Abd+NlUf6yOQAAAAAElFTkSuQmCC" class="jsx-3111688975"/></icon>Seja bem vindo ao meu app!Instalar como aplicativo PWAInstalar em seu dispositivoAcesso RestritoEntrar / RegistrarBackoffice System (BOS)Dados 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💰EASYBANK💳EASYPAY💼EASYWORK👨‍🎓MASTERCLASS📲YOU2APP💘COOLPIDO🎁BRXInsightsHackerRank5Sock 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 / 🏭 💰 EASY BANK / ⏳ 💳 EASY PAY / ⏳ 💼 EASY WORK / ⏳ 👨‍🎓 MASTER CLASS / ⏳ 📲 YOU 2 APP / 🏭 💘 COOLPIDO / ⏳ 🎁 BRX / 🏭
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...