Estoy publicando mis soluciones a los desafíos de HackerRank como una forma de mejorar mi aprendizaje, reforzar mi conocimiento y establecer una comprensión de los conceptos cubiertos. Si ayudo a alguien compartiendo en el camino, ¡aún mejor!
Sock Merchant es uno de los desafíos iniciales con dificultad 'EASY'.
Juan trabaja en una tienda de ropa. Tiene una gran pila de calcetines que debe clasificar por color para la venta. Dada una matriz de números enteros que representan el color de cada calcetín, determine cuántos pares de calcetines existen con los colores correspondientes.
Por ejemplo, hay n = 7
calcetines con colores ar = 1, 2, 1, 2, 1, 3, 2
. Hay un par del color 1 y un par del color 2. Hay tres calcetines impares, uno de cada color. El número de pares es 2.
Una función que debería devolver un número entero que represente el número de pares de calcetines coincidentes disponibles.
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 ;
Primero creé tres variables; socks
es un objeto que registra el conteo de cada tipo de calcetín; count
para llevar la cuenta del número de pares de calcetines; i
para iterar el forloop;
Creé un loop for
que recorrerá la matriz de colores del calcetín. Iterará n
veces, que es la cantidad dada de calcetines en la pila. for (var i = 0; i < n; i++)
La condición if
comprueba si el color existe en nuestro objeto socks
: if (ar[i] in socks)
Si existe, incremente el recuento de ese color en uno: socks[ar[i]] += 1;
De lo contrario, cree una clave con ese color y configúrela en 1. socks[ar[i]] = 1;
Después de que se hayan contado los calcetines, ejecute un map
en el objeto socks
, por lo que se separará un elemento para cada clave: Object.keys(socks).map(el => {
Luego calculo el número de pares dividiendo el número de "calcetines" de un color socks[el] / 2
y luego aplicar la respuesta, dos tildes (bitwise NOT).
Usé el bitwise NOT como sustituto de lo Math.floor(), ya que hace la misma operación mucho más rápido, como se puede comprobar en https://jsperf.com/jsfvsbitnot
Finalmente, termino la función devolviendo la cuenta final.
Otros idiomas que hablo
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;
}
Pensamiento: Generalmente los que saben poco hablan mucho y los que saben mucho hablan poco.