diemax / learning

Our infinite learning journey
1 stars 0 forks source link

Most repeated string #5

Open diemax opened 4 years ago

diemax commented 4 years ago
const str = ['hello', 'world', 'hello', 'world', 'world'];

function mostRepeated(str) {
  let repeated = str[0];
  let greater = 0;
  const checked = [];
  let current;
  for (let idx = 0; idx <= str.length; idx++) {
    current = str[idx];
    if (checked.indexOf(current === -1)) {
      let currentCount = 0;
      for (let index = 0; index <= str.length; index++) {
        if (str[index] === current) {
          currentCount++
        }
      }
      if (currentCount > greater) {
        repeated = current;
        greater = currentCount;
      }
      checked.push(current)
    }
  }

  return repeated;
}

console.log(mostRepeated(str)) // 'world'

Hola Rodrigo! :smile:

Este problema es super básico, pero esta vez despues de resolver unos cuantos en exercism por fin tuve tiempo de mirarlo, estos son los pasos que vinieron a mi mente:

  1. Asumir que el primero es el resultado así reemplazarlo de ser necesario.
  2. Recorrer el array y obtener el current word.
  3. Recorrerlo de nuevo para compararlo con el current, si encuentro iguales valores sumo++ el contador del current word.
  4. Después de recorrer todo el Array y compararlo con el current si el contador es mayor al greater esa palabra pasa a ser la más repetida.
  5. Guardo el current word dentro de checked así me aseguro de no recorrerla más de una vez por palabras.

Sidenotes

Que te parece? Cuando tengas tiempo si tienes 10 minutos para dejarme un feedback? 😅

Muchas gracias!

iamrodrigo commented 4 years ago

performance es correcto, la solucion es n * 2 (no n 2 pero asumo que fue un error de teclado).

Tu solucion es correcta pero es la mas ineficiente. Tip, investiga acerca de las hashtable (en JS es un simple objeto {}) y usalo a tu favor, el runtime de este programa se puede reducir a O(n)

diemax commented 4 years ago
const str = ['hello', 'world', 'hello', 'world', 'world'];

function mostRepeated(str) {
  let repeated = str[0];
  let greater = 0;
  const checked = {};
  for (let idx = 0; idx < str.length; idx++) {
    checked[str[idx]] = (checked[str[idx]] || 0) + 1;
    if (checked[str[idx]] > greater) {
      greater = checked[str[idx]];
      repeated = str[idx]
    }
  }

  return repeated;
}

console.log(mostRepeated(str)); // 'world'

Esta es la solución que se me vino a la mente ahora, por suerte después de hacer un poco de debugging me daba cuenta de los errores mientras iba modificando el ejemplo anterior. Los pasos que vinieron a mi mente son:

Any thoughts?

Muchas gracias Rodrigo! 😄