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 compartilhando ao longo do caminho, melhor ainda!
Sock Merchant é um dos desafios iniciais com a dificuldade 'EASY'
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.
Uma função que deve retornar um inteiro representando o número de pares correspondentes de meias disponíveis.
9
10 20 20 10 10 30 50 10 20
3
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;
}
let socks = {},
count = 0 ,
i = 0 ;
Primeiro criei três variáveis; socks
é um objeto que registra a contagem de cada tipo de meia; count
para manter a contagem do número de pares de meias; i
para iterar o forloop;
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 são contadas, executar 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 o Math.floor(), pois ele executa a mesma operação muito mais rápido, como você pode conferir em https://jsperf.com/jsfvsbitnot
Por último, finalizo a função retornando a contagem final.
Outras línguas que eu falo
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
def sockMerchant (n , ar ):
socks = collections .Counter (ar )
count = 0
for el in socks:
count += socks[el ] // 2
return count
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
}
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;
}
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;
}
function sockMerchant ($n , $ar ) {
$socks = array_count_values ($ar );
$count = 0 ;
foreach ($socks as $el ) {
$count += intdiv ($el , 2 );
}
return $count;
}
Pensamento: O que não provoca minha morte faz com que eu fique mais forte.