Resuelvo un EJERCICIO REAL de ENTREVISTA TÉCNICA para posición de Ingeniero de Software

Поделиться
HTML-код
  • Опубликовано: 20 авг 2024

Комментарии • 565

  • @franciscomesias8905
    @franciscomesias8905 3 года назад +548

    Has un mini curso sobre estructura de datos estaría genial, buen video 👌

    • @beatlife3990
      @beatlife3990 3 года назад +10

      Buenisimo bro , salio o no el mini curso sobre estructura de datos ?? ksdjlas

    • @danbutron8791
      @danbutron8791 3 года назад

      Eso estaría increíble

    • @gonove97
      @gonove97 3 года назад +12

      Podrías ver el CS50 de Harvard, explican muuy bien, en la semana 5 específicamente.

    • @VictorCastroVikman
      @VictorCastroVikman 3 года назад +2

      @@gonove97 gracias bro, datos asi te alegran el dia, vi ese curso pero justo me quedé antes de esa semana, ahora lo chequeo. Suerte.

    • @gonove97
      @gonove97 3 года назад +4

      @@VictorCastroVikman tomate tu tiempo para hacerlo, de verdad tiene concepto muy buenos y muy bien explicados, es pesado de seguir? Por supuesto es Harvard. Yo voy en la semana 4 y bastante impresionado.

  • @fran3031
    @fran3031 3 года назад +291

    Deberías subir + vídeos de este estilo, se aprende muy bien a programar viendo a un profesional experimentado haciéndolo.
    Un saludo Betta

  • @jorgeandresbravomeza8511
    @jorgeandresbravomeza8511 3 года назад +25

    Podrías usar la función de normalize() sobre TODO el texto antes del for y evitar aún mas consumo innecesario (ya que lo usas 3 veces por cada ciclo) suponiendo que JS guarde en memoría la primera vez que usas normalize() sobre una palabra aún lo estaría haciendo una vez por palabra en vez de una vez en total.

  • @alejandrobravo1221
    @alejandrobravo1221 3 года назад +74

    Codewars y hackerrank sirve mucho para este tipo de ejercicios! DATO

    • @finnelhumano3326
      @finnelhumano3326 3 года назад +1

      Es cierto gracias

    • @MiguelChinchay
      @MiguelChinchay 3 года назад

      Si es correcto ahí hay muchos ejercicios parecidos, yo lo resolví con 'reduce' de los arrays que me pareció más sencillo

  • @jrerehs96
    @jrerehs96 3 года назад +77

    Woooooo! Estaría genial que vieras listas de problemas des icpc

  • @marcopablomazariegosmacari530
    @marcopablomazariegosmacari530 3 года назад +126

    Me siento muy orgulloso de haber pensado en las tablas hash para hacer eso. 😭 No fueron al carajo las trasnochadas con estructuras de datos intentando que salieran las estructuras.

    • @juliocesarborgeslopez217
      @juliocesarborgeslopez217 3 года назад

      Los métodos de búsqueda uff

    • @GerdSa
      @GerdSa 3 года назад +23

      @@osiris7998 mc Donalds

    • @ChorlosHard
      @ChorlosHard 3 года назад +3

      Parecerá tonto, pero pensé la solución sin saber que son las tablas Hash jajajajaja

    • @marcopablomazariegosmacari530
      @marcopablomazariegosmacari530 3 года назад +2

      @@osiris7998 Una empresa de Estados Unidos.

    • @serkratos1216
      @serkratos1216 2 года назад +2

      @@GerdSa Plot twist: Trabaja programando las maquinas de hacer pedidos D:

  • @pablolanda1212
    @pablolanda1212 3 года назад +23

    bro, he aprendido más en un video de 10 mins que en 3 meses de carrera jajajajaja.

  • @gabrielmoreno4135
    @gabrielmoreno4135 3 года назад +1

    Excelente video!
    He notado que no muchas personas lo usan, pero JavaScript trae consigo una implementación de Hash Map (new Map()) y Hash Set (new Set()) para este tipo de casos (a pesar de que es prácticamente igual que el objeto o {}). En mi caso mi solución fue la siguiente:
    text = text.toLowerCase().replace(/[^a-zA-Z ]/g, "").split(/\s/);
    const appearances = text.reduce((acc, val) => {
    if (!acc.has(val)) {
    acc.set(val, 1);
    } else {
    acc.set(val, acc.get(val) + 1);
    }
    return acc;
    }, new Map());

  • @gindCode
    @gindCode 3 года назад +7

    Amigo muchas gracias por compartir éste vídeo, me pareció divertido e interesante, para mi estos son Mini Challengers ó Mini desafíos. Te quería comentar que éste código tiene una debilidad, tendrías que ingresar todos los caracteres extraños posibles para normalizar, creo que sería mejor normalizar considerando que las letras mayúsculas de la "A" a la "Z" van desde el carácter 65 hasta el 90. (esto es devolviendo el valor del caracter) y las letras minúsculas de la "a" a la "z" van desde el 97 hasta el 122. Cualquier carácter que esté fuera de ese rango lo sustituyo por un espacio en blanco, de esa forma elimino todos los caracteres extraños (sin tomar en cuenta los acentos). Espero haberme explicado amigo y sería interesante ver que lo implementaras. Yo lo que pasa es que no programo en éste lenguaje, pero tengo conocimientos de otros lenguajes.

  • @Alexis-kg1sm
    @Alexis-kg1sm 3 года назад +1

    Eso estaba en un ejercicio en la primer materia de la carrera de sistemas. Ni siquiera de examen.
    En python era el curso.
    Mi solución:
    1. Hacer todo minúscula. Es una linea. Todos se rompían la cabeza a falta de esto.
    2. Crear un diccionario.
    3. Comenzar detectando palabras desde la primera letra a la última usando isalpha (esta otra sí estaba recomendada por el ejercicio mismo) Volcar al diccionario sumando 1.
    No veo mayores ineficiencias salvando que es un lenguaje de alto nivel y no tengo la más pálida de idea de como hace todo...
    Lo mismo sucede en casi todo lenguaje. Lowercase+isalpha+sumar en un contenedor str:int. Debería bastar y el único trabajo es tener cuidado para construir el control de palabras, que donde comienza, termina y el final de la cadena para evitar fallos.

  • @andreinariera9909
    @andreinariera9909 3 года назад +7

    ¡Excelente explicación! gracias.
    me gustaria agregar que tambien se podrian normalizar los simbolos (como punto, coma, y demás) con una expresión regular que elimine todo lo que no sea letra o número. Por ejemplo, está: [^a-zA-Z0-9] ...de esta manera nos asegurariamos que si o si se eliminaran todos.
    Y tomar en cuenta también los acentos y demas cositas raras que pueden ir sobre las letras 😆
    Hay muchas formas de hacer esto, y muchos ejemplos en internet. No estoy segura de cual sea la mas rapida.
    También, no estoy completamente segura, pero, ¿normalizar todo el string al comienzo no es más eficiente que llamar a la función por cada palabra?

    • @y0k3s3
      @y0k3s3 2 года назад

      Lo dice él mismo en el video...

    • @JorgeLPausa
      @JorgeLPausa 2 года назад

      Hay que tener en cuenta que esa regEx también elimina los espacios en blanco, por tanto si se aplica al texto de entrada, luego el resultado no será el esperado

    • @JorgeLPausa
      @JorgeLPausa 2 года назад

      pudiera quedar de esta forma [^\sa-zA-Z0-9]

  • @diegorossi9406
    @diegorossi9406 3 года назад +1

    Buen video! Yo hubiese normalizado la cadena y luego del split ordenado alfabéticamente, entonces comparaba con la palabra anterior: si matchea incremento contador, sino, agrego entrada al diccionario con contador en 1 y avanzo a la próxima.

  • @pedrocarlosmartinez6289
    @pedrocarlosmartinez6289 3 года назад

    Una manera simple de bajar el costo computacional junto con la complejidad, perfecto para un ambiente de entrevista.
    Otras ideas que se me ocurre para reducir la constante aledañas al algoritmo, en términos de tiempos son:
    * DefiniR un máquina de estado, dónde se hay un estado que es la culminación de una palabra, dónde agregamos la palabra al hash.
    *Usar un trie con la particularidad que las hojas del mismo tienen una referencia una lista enlazada y la cantidad. Cuando encontramos una palabra, si no existe la agregamos al trie por ende adicionamos a la lista enlazada, y empezamos de nuevo por la raíz.

  • @MarceloAmigo_eu
    @MarceloAmigo_eu 3 года назад +8

    Muy interesante los videos de este tipo, a mi me pidieron implementar un juego de poker, y ni siquiera se jugarlo, jajaja

  • @erickeduardoreyessalgado8122
    @erickeduardoreyessalgado8122 3 года назад +2

    Apenas tuve una entrevista técnica en cual el problema fue el siguiente: recibir una cadena string y evaluar cuántas vocales y consonantes existían en esa cadena y después retornar las vocales y consonantes de forma ascendente y descendente. Me gustaría poder ver cómo lo implementarias por favor.

  • @williamd.garcia9417
    @williamd.garcia9417 3 года назад +1

    Bro, no se absolutamente nada de programacion, pero me entretuve tanto que vi todo el video, y entendi poco, pero dan ganas de aprender. Gracias Crack.

  • @ivansanz4029
    @ivansanz4029 3 года назад +1

    Al hacer .split() ya estás iterando todo el texto implicitamente, lo mismo al hacer .toLower() e incluso .replace(), asi que esta solución está bastante lejos de O(n).
    Puede hacerse en O(n) si iteras cada char y vas leyendo las palabras a mano

  • @NeoAres1
    @NeoAres1 Год назад

    Con la conclusión que me quedo (dentro de mi vulgaridad) es que es mejor pensar en una solución en la que solo sea necesario recorrer el array objetivo una vez. Gran vídeo!!!!!!!!!!. Primer vídeo que veo tuyo, suscripción obligada

  • @sergioalva5793
    @sergioalva5793 2 года назад

    Soluciona el problema, sí. Es por si misma una solución ocupando estructuras de datos, no tanto. Es como ordenar un arreglo usando un método Sort.
    La explicación es clara y precisa, eso sin duda. Saludos!

  • @kievandres
    @kievandres 3 года назад +2

    El conocimiento dado por un experto como tú es muy valioso!

  • @mauriciocaris2529
    @mauriciocaris2529 Год назад

    haciendo let separateWords= normalize(text).split(" "); te ahorras tener que llamar a normalize cada vez que vas iterando sobre el for, quizá no se note la optimización pero ayuda en textos muuuuy grandes

  • @EdenAlbertoSilvestre-bs6cw
    @EdenAlbertoSilvestre-bs6cw 3 года назад

    Mee encanta porque siempre estoy inseguro de lo que puedo hacer o lograr con los conocimientos adquiridos que tengo por la presión o demanda

  • @albertjjimenezp
    @albertjjimenezp 3 года назад +2

    Genial que usaras REGEXP para los replaces, me parece que se subutilizan mucho las expresiones regulares en el día a día de nuestro trabajo y eso genera que nos malacostumbremos a no usar esta poderosa herramienta.

  • @JaviArte
    @JaviArte 3 года назад +2

    Yo hace mucho tiempo que hice, pero si no me falla la memoria, las preguntas se podrían encajar en estos 3 tipos:
    - Te ponen un código (en mi caso Java) y tienes que encontrar errores
    - Te ponen otro código y tienes que decir cuál es su salida
    - Te plantean X problema y tienes que escribir (en código o pseducódigo) cómo lo resolverías
    Y básicamente se podrían encuadrar en esos tipos. Al menos por mi experiencia.

  • @luis96xd
    @luis96xd 3 года назад +1

    Yo pensaba que en una entrevista no se podían usar pre-built functions del lenguaje 🥴
    Este video me aclaró esa duda, me parece un alivio, gracias!

  • @JuanmaGuerrero
    @JuanmaGuerrero 3 года назад +1

    Está muy bueno lo que comentas sobre lo malo de usar el replace, así nomás, porque tendrías que crear un caso para cada caracter especial, en el texto puede haber comillas (simples, dobles, caligráficas, etc.), apóstrofes y un sinfín de caracteres más que deberías comprobar "a mano". Claramente no es el modo idóneo de encarar el problema, mejor matchear las palabras "words" y limpiar a partir de ahí. Excelentes como siempre tus videos, saludos desde Argentina!

    • @luis96xd
      @luis96xd 3 года назад

      O utilizar una expresión regular:
      replace(/[^\w|\s]/g,"");
      Cambiar a String vacío lo que no sean letras o espacios en blanco 😁

  • @BhEaN
    @BhEaN 3 года назад +26

    Buenas! Solo una puntualización: como lo que buscas es que el programa sea lo más optimo posible, no tiene sentido que llames a la funcion "normalize" 2 veces en cada iteracion. Lo suyo sería que la ejecutaras una única vez asignando su resultado a una variable (normalizedWord, por ejemplo) y de ahí en adelante uses dicha variable en lugar de volver a llamar a la función de nuevo. Saludos!

    • @robergroso
      @robergroso 3 года назад +3

      en verdad deberia normalizar el primer string antes de hacer el split y ya se olvidaba del tema

    • @BhEaN
      @BhEaN 3 года назад +1

      Quizás, aunque habría que ver el funcionamiento de dicha función, ya que si ese texto es muy grande, el “coste” de esa normalización puede que sea exponencial, en cuyo caso es mejor hacerlo con cada palabra

    • @JeSus-hl6zj
      @JeSus-hl6zj 3 года назад

      @@BhEaN sería lineal, no exponencial...

    • @BhEaN
      @BhEaN 3 года назад

      ​@@JeSus-hl6zj Si, tienes razón... me refería a que aumentaría de forma aritmética, si

    • @JeSus-hl6zj
      @JeSus-hl6zj 3 года назад

      @@BhEaN Y de otra forma no creo que sea

  • @navegantx
    @navegantx 3 года назад

    Hola, me ha gustado mucho tu video es el primero que veo y queria decir este fue el mismo ejercicio que me pidieron hacer en una entrevista que tuve unas semanas atrás. No la pase satisfactoriamente debido a que no pude completar el algoritmo. Ahora se ya se en que fallé.
    Nuevo suscriptor; saludos!

    • @BettaTech
      @BettaTech  3 года назад

      Gracias! Una lastima que no pasaras la prueba 😕 Mucho ánimo para las siguientes!

  • @ramdomcomentxqa7346
    @ramdomcomentxqa7346 3 года назад +3

    He aprendido en un día un poco de phyton usando videos de youtube y pude aproximar me a la solución, buen video

  • @Manuel-wj1xs
    @Manuel-wj1xs 3 года назад

    Este canal es increíble. El contenido como la calidad, mejor no puede ser. Explicas de 10. Espero que continúes con este tipo de vídeos, que, a mi parecer, ayudan muchísimo. También me encanta tu serie de patrones de diseño.

  • @jesusalvarez8540
    @jesusalvarez8540 Год назад

    No tengo mucho conocimiento teórico de algoritmos, solamente me gusta entrar a codewars y resolver problemas según mi analisis he investigación en google xd. Ese es un problema de memoizacion según como lo conozco. No tenia idea de como resolver un problema de ese tipo hasta que conocí ese concepto lo que me hizo ver cuan importante y útil es el conocimiento teórico y de conceptos. Buen video!

  • @luispedroraymundobrito6850
    @luispedroraymundobrito6850 3 года назад +3

    Podrías hablar sobre cursos de estructuras de datos en java o libros, te lo agradecería bastante 🥺

  • @mauricioperez130
    @mauricioperez130 3 года назад

    woooow, cuando lo puso justo pensé en la tabla hash, no creí que fuera la solución óptima, lastima que aún no la domino bien, una cosa para estudiar!

  • @francomansilla4088
    @francomansilla4088 3 года назад +6

    Esto es muy bueno sigue subiendo estos vídeos sobre ejercicios reales, saludos desde Argentina

  • @lurodev
    @lurodev 3 года назад

    Soy ingeniero electromecánico, pero quiero y estoy empezando a meterme en el mundo de la programación, este video está muy bueno para darse una idea del entorno laboral, gracias.

  • @arntor8353
    @arntor8353 2 года назад

    Estaría bueno este ejercicio de entrevista:
    Haciendo uso de la recursividad de funciones, escriba un programa que pida un valor entero positivo n, y
    luego que genere todas las combinaciones posibles de las cadenas de caracteres binarias de longitud n sin
    que haya 2 o más números uno consecutivos.
    Ejemplo:
    Entrada:
    Ingrese un valor entero positivo: 4
    Salida:
    0000 0001 0010 0100 0101 1000 1001 1010

  • @ninjao2417
    @ninjao2417 Год назад

    justamente un has(objeto en javascript) era lo que abia que usar pense desde el inicio del video, asi que antes de que lo resolviera pause el video e intente solucionarlo por mi cuenta este el resultado
    function count(text){
    text = text.split(" ")
    const counter = {}
    for(let word of text){
    if(!counter[word]) counter[word]=1
    else counter[word]++
    }
    return counter
    }
    console.log(count("hola hola que tal"))
    salida: { hola: 2, que: 1, tal: 1 }

  • @Jaxbulid
    @Jaxbulid 3 года назад +10

    Creo que utilizando reduce podría quedar más elegante. Muy buen video igualmente! Podrías traer alguno de pruebas técnicas más a nivel de system design y arquitectura?

    • @BettaTech
      @BettaTech  3 года назад +14

      Con reduce quedaría mucho más elegante si, aunque creo que se entiende más con un for y un if. Un día haremos algún video revisando las capacidades funcionales de js :D
      Sobre lo de system design, lo apunto! Puede ser muy interesante.
      Gracias por el comentario!

    • @lucasgonzalez5123
      @lucasgonzalez5123 3 года назад

      @@BettaTech No solo más elegante, no sería lineal? Estarías recorriendo solamente los elementos del array.

    • @BettaTech
      @BettaTech  3 года назад +1

      @@lucasgonzalez5123 Lineal ya es con el for, ya que solo recorres una vez los elementos del array. Con el reduce lo implementas con herramientas de programacion funcional, pero las dos implementaciones son lineales

    • @lucasgonzalez5123
      @lucasgonzalez5123 3 года назад +2

      Escribí antes de terminar de ver el video. Por lo tanto, con el reduce es igual pero mas "elegante" :P

    • @ozilbonilla
      @ozilbonilla 3 года назад

      Pienso lo mismo, reduce personalmente es más sencillo.
      const wordRepetitions=str =>{
      let paso1=str.toLowerCase().replace(/[.,!]/g,"").split(' ');
      let paso2=paso1.reduce((acc,el)=>{
      if(acc[el]){
      acc[el]++
      }else{
      acc[el]=1
      }
      return acc;
      },{})
      return Object.entries(paso2)
      }

  • @miguelantoniodiazdelgado6853
    @miguelantoniodiazdelgado6853 3 года назад +2

    Muy buen tutorial, seria bueno que subieras mas videos acerca de esto. Saludos desde Venezuela.

  • @mxskll
    @mxskll 3 года назад +1

    Buena explicación. Dos detalles: no llames tanto a `normalize()` y pegale una mirada a Map() para hash tables en Js/ TS ;) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

  • @boomboom-9451
    @boomboom-9451 3 года назад +4

    Bettatech, eres un grande, idolo, te quiero fiera ! Un ejemplo a seguir

    • @BettaTech
      @BettaTech  3 года назад

      Gracias máquina! Crack figura 😙💪💪

  • @Mike-t5w7x
    @Mike-t5w7x 3 года назад

    Wow, nunca pensé en tablas hash, pensé mas en una lista para guardar las palabras repetidas, pero veo que al final viene siendo lo mismo que el primero

  • @juanosio2219
    @juanosio2219 3 года назад +25

    Ese pro tip esta ÉPICO: "Cuando nuestro problema es buscar, nuestro problema es un candidato genial para ser atacado con las tablas de hash". Ojalá pudieras hacer un video dando tips como esos en cuanto a estructuras de datos se refiere y cuando se deben usar

    • @BettaTech
      @BettaTech  3 года назад +4

      Gracias!! Es que es tan real como la vida misma xDDD

    • @luis96xd
      @luis96xd 3 года назад

      Cuando vea este ejercicio o una búsqueda, utilizaré una tabla de hash 😄

    • @juansuarez372
      @juansuarez372 3 года назад +2

      Las tablas hash son más útiles para comparar strings de una manera más óptima, pero si tienes un problema en el que tengas que buscar no te centres solo en hash, también existen cosas como la búsqueda binaria, 2 punteros y otros algoritmos y estructuras más, saludos.

    • @pardo-2474
      @pardo-2474 3 года назад

      @@BettaTech Por que los programadores nos parecemos tanto? xDDD

    • @AutoFirePad
      @AutoFirePad 3 года назад

      @@pardo-2474 No os pareceis, pero sois unos frikis con ganas de pertenencia a grupo.

  • @willypaz6706
    @willypaz6706 2 года назад

    buen video, y pudedo decirles que es real en un proyecto me encontré con este problema no siempre con palabras sino con registros de una DB cuando haces un dasboard tienes que sacar estadisticas de varias cosas y para eso hay que contar y hay ocaciones en el que hacerle un GROUP BY a la DB no alcanza.

  • @leviathan0664
    @leviathan0664 3 года назад

    Increíble video! Quisiera comentar mi ejercicio de una entrevista que tuve hace poco haber, y no la pase por no saber mucho de APIS si pudieras hacer un video de ella seria genial:
    --Crear una aplicación movil o pagina web (cualquiera de las dos). para visualizar películas tomadas de una API.
    - Debe tener un top 10, un filtro por actores y un buscador funcional donde al ingresar el nombre de la película pues lleve a ella.
    -La API es del sitio The Movie Data Base.
    Es la primera ves que me sale una prueba de este tipo.

    • @ultraman6950
      @ultraman6950 3 года назад

      Recuerdo haber visto algo similar en un curso de Django.
      Edit: De hecho, creo que era lo mismo.

  • @luiseduardosotoj1183
    @luiseduardosotoj1183 3 года назад

    Hola, muchas gracias. Justo esa prueba me pasaron en una entrevista de trabajo. Únicamente que con la variante que no había que contar palabras.
    Había que contar letras y devolver la letra que mas se repetía.

  • @pablogomez8193
    @pablogomez8193 3 года назад +3

    No entiendo absolutamente nada, pero me subscribo!

  • @Miguel-iu5sf
    @Miguel-iu5sf 3 года назад +1

    Buenísimo, si tienes la oportunidad, sigue con este tipo de videos!!

  • @kaxalope
    @kaxalope 3 года назад

    Cuando quieras usar diccionarios como ese en typescript puedes usar el tipo record. Ejemplo: "Record"

    • @BettaTech
      @BettaTech  3 года назад +2

      No lo conocía, gracias!!

  • @jcg83
    @jcg83 3 года назад +1

    Muy buenas. Buen video y explicaciones muy claras. Felicidades. He de decir que he echado en falta un poco la explicación del coste asociado a un split o a un regex. Y también "la magia" de los costes constantes de las tablas hash. ¿Qué coste tiene recorrer una tabla hash? Estamos de acuerdo que es un O(n), pero hay detalles que deberían tenerse en cuenta también y que se dan por supuestos. ¡Buen trabajo! Te descubrí hace poco y, por supesto, te seguiré viendo. Sigue así. Un abrazo.

  • @anonimxwz
    @anonimxwz 2 года назад

    otra solucion que quizas no es más eficiente pero si más rapida de hacer es usando regex, por cada palabras aplicas regex sobre el texto y obtienes la cantidad de matches. sale bastante sencillo con eso.

  • @nexiss001
    @nexiss001 3 года назад

    Deberías normalizar la palabra 1 vez en el loop, guardarla en una variable y luego usar las comparaciones. En tu implementación estás normalizando cada palabra dos veces, una para saber si existe y otra para incrementar el contador.
    Además, seguramente sea más eficiente normalizar el texto completo original 1 única vez, y luego iterar sobre el resultado de hacer el split (Tendría que hacer una prueba para estar seguro de esto, pero el cuerpo me dice que será más óptimo hacerlo como comento).

  • @Tienda4gamers
    @Tienda4gamers 2 года назад

    Antes de ver el vídeo comento para ver si tengo idea , usando un diccionario o hashtable utilizando memoization

  • @Vanilthas59
    @Vanilthas59 Год назад

    SIIIIIIII PLS, SIGUE SUBIENDO ESTE TIPO DE COSAS, QUIERO TRABAJO AJLKDSAJD

  • @joelalexanderquintero9814
    @joelalexanderquintero9814 3 года назад

    Hermano que buen video!!!! para todos aquellos que nos estamos iniciando y estamos en el nivel llamado junior de verdad muchas GRACIAS!!! POR SU APORTE.

  • @firielcasselius4033
    @firielcasselius4033 3 года назад

    No he visto el video. Pero mi idea es la siguiente:
    Creo un arreglo, en cada posicion irá una palabra, luego de haber sido normalizada, nada de comas, puntos, o signos de admiracion/interrogacion. Luego con un for se revisará el texto buscando las coincidencias de cada elemento del arreglo, contando cada vez q se tope con una repeticion, al final de cada bucle se guardará el resultado concatenado con la palabra buscada, dentro del arreglo. Se repite este proceso con cada elemento del arreglo.

  • @ivansarjanovich3769
    @ivansarjanovich3769 3 года назад

    Genial el video! Para mi que recién estoy empezando a programar es muy útil e importante ver videos como estos y codigo real.

  • @antoniomadrid7870
    @antoniomadrid7870 3 года назад

    Un genio, me encanta tu contenido. Tengo intención de ponerme al día con tu canal! Explicas muy bien y haces llegar conocimiento que suele estar un poco menos accesible, como la complejidad algorítmica.

  • @juanpabloescobarzapata8654
    @juanpabloescobarzapata8654 3 года назад

    Es importante hablar tanto de estos algoritmos, como aquellos que son in situ, también es un valor añadido muyyyyy valioso que este algoritmo no posee

  • @carlosjavierbellotti6660
    @carlosjavierbellotti6660 3 года назад

    Muchas gracias por la info. La resolución de algoritmos es super importante en las entrevistas. Hay que invertir tiempo en Hackerrank :D. Por otro lado, posiblemente un enfoque mas compacto seria el siguiente.
    function wordRepetitions(text) {
    let words = text.toLowerCase().split(/[\s|\.|\,]/g)
    return words
    .filter(p => p)
    .reduce((totales, p) => {
    if (!totales[p])
    totales[p] = 0
    totales[p]++;
    return totales;
    }, {})
    }
    Abrazo!!!

  • @diegofernandez1412
    @diegofernandez1412 3 года назад +1

    buenisimo video, me estoy iniciando en el mundo de la programacion y cada vex me parece más interesante, gracias por el video

  • @davidalexanderrios5874
    @davidalexanderrios5874 3 года назад

    No estoy seguro de cuantas cosas comparten js y ts, pero en js hay una función reduce(), la ultima parte del for con el reduce quedaria algo asi como arrayPalabras.reduce((acc,elem)=> acc[elem] ? acc[elem]+=1 : acc[elem] = 1, {} ) y el resultado seria el mismo

  • @ivandlf1639
    @ivandlf1639 2 года назад

    Excelente video y muy buena data! En uno de los cursos de js que hice uno de los challenges era hacer un encriptador de texto y empleamos el replace con regex.
    Nuevo suscriptor!

  • @deltodounpoco8710
    @deltodounpoco8710 2 года назад

    Genial! soy estudiante aún y me inspira mucho tus vídeos , gracias !

  • @andresruedamarin599
    @andresruedamarin599 2 года назад +1

    Pienso que para hacerlo aún más eficiente debería suprimirse el método Split. Hacer un único bucle que mientras que parte las palabras realiza la comparativa. En ese caso el coste sería de N y no de 2N.

    • @GerdSa
      @GerdSa 2 года назад

      cual seria la solucion ?

  • @ofebkouki
    @ofebkouki 3 года назад +1

    Ver que pensé algo así me hizo sentir bien conmigo mismo

  • @joandelacruz2764
    @joandelacruz2764 3 года назад

    Soy la definición de novato hecha humano en la programación y estuvo muy interesante el como analistaste y solucionaste el ejercicio.

  • @danielaakerman
    @danielaakerman 2 года назад

    Quiero y *necesito* este tipo de contenidos. Gracias!

  • @sanguchet3646
    @sanguchet3646 3 года назад

    Para un mismo problema hay varias soluciones, lo importante es saber cuál algoritmo aplicar 🙌

  • @NatsumaruSama
    @NatsumaruSama 3 года назад

    Como apenas se C, habia pensado en una respuesta algo diferente: crear una lista enlazada y ordenada donde cada nodo sea una estructura de 3 elementos; un string con la palabra, un contador y otra lista con las posiciones de dicha palabra, se realizaria un ciclo donde se leeria cada palabra, se comprueba con cada elemento de la lista, y en caso de coincidir se aumentaria en uno el contador de esta, ademas de agregar el indice de esta palabra a la lista de ocurrencias; si esta palabra a su vez ha salido mas veces en la lista que la inmediatamente superior cambiarian de lugares; caso contrario se crearia un nuevo nodo con la palabra, su contador en 1, y su indice con la posicion de ocurrencia, haciendolo desde la primera hasta la ultima palabra.... tiene la ventaja de que solo se harian n comprobaciones (donde n es el numero de palabras en la entrada) y como peor caso (donde todas las palabras sean diferentes) se usaria en memoria el tamaño del nodo * numero de palabras, que no es exactamente eficiente, pero hace un buen uso del espacio al usar asignacion dinamica de memoria.....
    Ademas tiene la ventaja de que a traves de la lista ordenada de salida se podria reconstruir el texto de entrada....
    Supongo que en algo se parcera a la solucion del video...
    Saludos....

    • @purecodingview6916
      @purecodingview6916 2 года назад

      No es práctico porque, en tu mejor caso, la lista debería tener solo un elemento ya que todas las palabras son iguales, en ese caso una recorrido en el string bastaría y no sería necesaria la lista. En tu peor caso, el tiempo es igual al que se explica en la solución poco eficiente en el video y a eso agrégale el espacio ocupado por la lista el cual tiende a O(n), lo cual lo hace más ineficiente. Pero está muy bien que hayas querido dar tu propia respuesta al problema, sigue así. Psdta: yo tbn comencé con c y c++

  • @JaviArte
    @JaviArte 3 года назад +8

    Veo que hemos coincidido en el enfoque :) Irlas metiendo en un diccionario, y si es la primera vez que la encuentras le pones 1 al contador, y si ya estaba pues incrementas.
    Estaría genial algún vídeo sobre expresiones regulares. Siempre que las tengo que usar, me peleo mucho con ellas XD Lo malo que no hay un estándar :( Quiero decir, en Java son de una forma, en typescript de otra... aunque más o menos se comparten conceptos.

    • @javiergavilanmerida2133
      @javiergavilanmerida2133 3 года назад +1

      www.freeformatter.com/java-regex-tester.html#ad-output
      Muchas veces el truco está en poner que escoja lo que no quieres, en lugar de que escoja lo que quieres. Por ejemplo:
      Si para esta url:
      url.com/lalala?v=codevideo&pa1=lalala¶2=lalala
      Quieres que solo te seleccione "v=codevideo", como sabes que el carácter separador es &, puedes hacer lo siguiente:
      v=[^\\&]+
      Que se traduce en:
      1. v -> tiene que ser una v
      2. = -> tiene que ser un =
      3. [^\\&] -> tiene que ser algo distinto de &
      4. + -> Que aparezca el grupo anterior 1 o más veces
      Si en lugar de eso buscas v=.+[^\\&], no se va a filtrar como quieres. '&' está incluido dentro de '.' , y como las expresiones regulares funcionan "desde fuera hacia dentro", nada más encuentre algo que no sea '&' (el no & más exterior, empezando por el final), te va a seleccionar todo (.+) hasta que encuentre el primer 'v=' que exista (el más exterior empezando por el principio). Dicho de otra forma, en el ejemplo anterior te seleccionaría:
      v=codevideo&pa1=lalala¶2=lalala
      Y si hay un estándar para las expresiones regulares (en.wikipedia.org/wiki/Regular_expression#Standards), lo que sucede es que casi todos lo usan solo como referencia (vamos, que solo cumplen la parte más básica y sencilla, y como les viene en gana)

    • @manuelaranguri630
      @manuelaranguri630 3 года назад

      .

  • @josedejesuszaragoza5516
    @josedejesuszaragoza5516 3 года назад +1

    Exijo más contenido como ésto. Gracias y porfavor.

  • @juanmaguevara
    @juanmaguevara 3 года назад

    Gran explicación, recién empiezo en este mundo y lo entendí relativamente rápido! Gracias!

  • @CarlosAyalaCalvo
    @CarlosAyalaCalvo 2 года назад

    Llevo 15 años en la informático y en todos los empleos en que he quedado no me han hecho pruebas ni test, supongo que en los test siempre me va mal porque los hago con desgana, es como si mi currículum y experiencia no valieran y me hicieran volver a hacer un ejercicio de un test de la universidad.

  • @carsdfj
    @carsdfj 3 года назад

    Me encanto seria padre que colocaras mas sobre temas de evaluación al momento de una entrevista o de resolver típicos problemas con los que podríamos conseguirnos

  • @erickventura4380
    @erickventura4380 3 года назад

    Que interesante que este tipo de problema, lo he tenido en algunos proyectos con Python de hecho el tipo de estructura se llama diccionario, me hace feliz que he ido por el buen camino.
    Me suscribo acabo de descubrir tu canal :)

  • @dianagosd1335
    @dianagosd1335 2 года назад

    Hola, me gustó mucho su video. Me gustaría que hablara sobre soluciones lineales y soluciones cuadraticas, saber diferenciar cuando utilizar las soluciones

  • @facundocorrea4055
    @facundocorrea4055 2 года назад

    Genio total!! Desde Ururguay! Me encanta tus videos, un abrazo grande CRACK!

  • @simonfredes9126
    @simonfredes9126 3 года назад

    Buen video, apenas mencionaste el enunciado se me ocurrió hacerlo con un Mapeo. Buena solución. Saludos

  • @jimmymontenegro8517
    @jimmymontenegro8517 3 года назад

    Wow, que simple lo haces ver, da gusto, felicidades.

  • @naylord5
    @naylord5 3 года назад

    Un hombre de buen gusto por lo que veo, noté que tienes un OnePlus 6T igual que yo, permíteme estrechar su mano de poeta a poeta.

  • @adrim.m.7149
    @adrim.m.7149 3 года назад +1

    no entiendo el por qué pones ++dict[normalize(word)] en vez de dict[normalize(word)]++,
    ¿alguien me puede explicar por favor,? ya que según lo que tengo entendido lo primero no cambia el valor de la variable, llave en este caso

  • @deimne970
    @deimne970 3 года назад +2

    Buen vídeo. Yo he pensado exactamente la misma forma de hacerlo.

  • @michaelcastillo4402
    @michaelcastillo4402 3 года назад

    Excelente video. Al decir que ibas hacer el ejercicio me puse a resolverlo antes de ver el video. No pensé en lo de eliminar los signos. De resto se logro. Gracias por traer tan buen material.

  • @demomanprism1
    @demomanprism1 3 года назад +3

    Una vez tuve un problema, iba de simular un teclado de móvil antiguo, las teclas estaban asignadas así:
    1: 1 ó punto
    2: 2abc
    3: 3def
    4: 4ghi
    5: 5jkl
    6: 6mno
    7: 7pqrs
    8: 8tuv
    9: 9wxyz
    0: 0 ó espacio
    #: Activar o desactivar mayúsculas
    Por defecto iniciaba en mayúsculas.
    Por ejemplo la entrada:
    444#6666555522
    debía imprimir "Hola"
    Y además era cíclico, tipo 22 debía imprimir "a" pero 222222 también era "a"
    Y para mostrar letras de la misma tecla, usando espacios, ejemplo 2 22 222 debía imprimir 2ab
    Nunca lo pude resolver sin gastar mucha memoria ;-;

    • @luis96xd
      @luis96xd 3 года назад +2

      Ese problema se ve muy bueno 😱
      Y complicado jajaj

    • @javiergavilanmerida2133
      @javiergavilanmerida2133 3 года назад

      Supongo que el chiste estará en el hecho de no gastar mucha memoria...jummm
      Es java, pero.. ¿Qué te parece esta solución?:
      public class TecladoMovil
      {
      private final char[][] dictionary = new char[][]{
      {'0', ' '},
      {'1', '.'},
      {'2', 'a', 'b', 'c'},
      {'3', 'd', 'e', 'f'},
      {'4', 'g', 'h', 'i'},
      {'5', 'j', 'k', 'l'},
      {'6', 'm', 'n', 'o'},
      {'7', 'p', 'q', 'r'},
      {'8', 't', 'u', 'v'},
      {'9', 'w', 'x', 'y', 'z'}
      };

      boolean uppercase = true;
      int nextIndex;
      String text;
      StringBuilder result;
      private TecladoMovil( String text ) {
      this.text = text;
      this.result = new StringBuilder( text.length() / 4 );
      }
      /**
      * Traduce las pulsaciones introducidas por teclado móvil a texto final
      *
      * @param text
      * @return
      */
      public static String parse( String text ) {
      TecladoMovil tm = new TecladoMovil( text );
      while( tm.pushChar() );

      return tm.result.toString();
      }

      private boolean pushChar() {
      char nextChar = text.charAt(nextIndex);
      int count = 0;
      while( nextIndex < text.length() && text.charAt(nextIndex) == nextChar ) {
      ++count;
      ++nextIndex;
      }

      resolve( nextChar, count );

      return nextIndex < text.length();
      }

      private void resolve( char c, int times ) {
      if( c == ' ' ) {
      return;
      }

      if( c == '#' ) {
      applyUppercase( times );
      } else {
      applyChar( c, times );
      }
      }

      private void applyUppercase( int times ) {
      if( times % 2 == 1 ) {
      this.uppercase = !this.uppercase;
      }
      }

      private void applyChar( char c, int times ) {
      int dictionaryIndex = Integer.parseInt( ""+c );
      int charIndex = (times - 1) % dictionary[dictionaryIndex].length;

      char resultChar = dictionary[dictionaryIndex][charIndex];

      result.append( this.uppercase ? Character.toUpperCase( resultChar ) : resultChar );
      }
      }

  • @federicosperanza7142
    @federicosperanza7142 3 года назад

    Ojalá fuesen esos test. En puestos jr he visto que piden armar una api, front, conectarse a la BD y realizar operaciones...

  • @aerok3
    @aerok3 3 года назад +47

    Lo único que corregiría de tu algoritmo es que llamas 2 veces a normalize por cada palabra iterada. No sería mejor almacenar el resultado en una variable al principio del bucle?

    • @DavidPerez-iz6bq
      @DavidPerez-iz6bq 3 года назад +6

      para mi seria mejor normalizar toda la cadena desde un principio asi solo llamas a la funcion una vez

    • @leandrosantosferreiro8443
      @leandrosantosferreiro8443 3 года назад

      El split se puede evitar (Un recorrido al string menos) :)

    • @franciscomiguelcasimiro4574
      @franciscomiguelcasimiro4574 3 года назад

      @@leandrosantosferreiro8443 El split es la clave, no te puedes quitar de encima recorrer el string.

    • @elmervelazquez3549
      @elmervelazquez3549 3 года назад

      Lo que dices no reducirá el coste computacional

    • @leandrosantosferreiro8443
      @leandrosantosferreiro8443 3 года назад

      @@franciscomiguelcasimiro4574 Se puede recorrer el string posición a posición y consultar por su valor sin recorrerlo completamente para generar un nuevo array en memoria. De igual manera seguiría siendo O(N).. Pero sería mínimamente más óptimo.

  • @RGS1970
    @RGS1970 3 года назад

    gracias, simple algebra lineal y matrices, eso es todo en estructura de datos. La gente hoy en dia tiende a memorizar funciones y procesos y se olviden de donde viene todo, matemáticas, Nuevamente gracias y saludos

  • @freedomlatinoamericaoficia1468
    @freedomlatinoamericaoficia1468 3 года назад

    Están geniales estos vídeos resolviendo ejercicios. Por favor continúa haciendo más

  • @irving7653
    @irving7653 3 года назад

    Wow, quiero llegar a tener tantos conocimientos y mucha habilidad como tú 😯

  • @psicodelico6
    @psicodelico6 3 года назад

    1) El hash en peor caso se comporta como una lista enlazada. La busqueda es O(n).
    2) La estructura que cumple eso es el Trie porque la longitud de las palabras son acotadas. Pero tiene un costo de almacenamiento muy alto. Seria O(#CantidadDeLetrasMinusculas^(#LongitudDePalabraMasGrande)) en peor caso.

  • @Alvaro0404
    @Alvaro0404 3 года назад

    Una duda, has dicho que la solución eficiente sería de complejidad constante sin embargo en realidad estarías haciendo una búsqueda de complejidad lineal (si es cierto que sería O(n) en vez de O(n^2)

  • @Luckelucke01
    @Luckelucke01 3 года назад

    un pequeño inciso en lugar de llamar normalize varias veces mejor guardar en una variable el resultado de normalize ¿ no ? evitamos procesamiento innecesario.

  • @akirachimaki
    @akirachimaki 2 года назад

    Gracias,es un super video, replique el código en javascript y Python, es genial

  • @maanutsx
    @maanutsx 3 года назад

    Muy divertido el ejercicio, lo único que cambiaria seria realizar el normalize al mismo tiempo que haces el split, asi te evitas chequear por normalize por cada palabra, y por último y esto ya es más un gusto personal, en vez de usar el if/else, simplemente dict[word] = ++dict[word] || 1

  • @97dvm
    @97dvm 3 года назад

    muy buen video , estoy en mi primer año de carrera y me das la vida con este contenido

  • @eder_
    @eder_ 3 года назад

    Muy util! Estaria bueno seguir con la serie, viendo distintas preguntas tecnicas de entrevistas!

  • @hectorkaizenf.v.7224
    @hectorkaizenf.v.7224 3 года назад

    Mas de estos por favor...
    Pero también podrías hacer la versión ¿orientada a objetos y la versión con programación funcional? GRACIAS MIL

  • @komurodiaz3688
    @komurodiaz3688 3 года назад +1

    Execelente video , gracias , soy beginner pero gracias a ti conozco bastante. A practicar!!

    • @BettaTech
      @BettaTech  3 года назад +1

      Mucha suerte!

    • @komurodiaz3688
      @komurodiaz3688 3 года назад

      @@BettaTech muchas gracias crack, espero algun dia llegar a tener el conocimiento que tú tienes.

  • @wirlann
    @wirlann Год назад +1

    Hola, ¿no sería más optimo normalizar primero todo el string de entrada o sino, asignar la normalizacion de la palabra en una variable en vez de repetir la llamada 3 veces?