Problema REAL de DISEÑO de SISTEMAS (Visto en entrevista para posición de ingeniero de SOFTWARE)

Ғылым және технология

Las entrevistas de diseño de sistemas no siempre son fáciles... ¡Os muestro la que hice yo!
👾 Redes sociales 👾
► Twitter: / bettatech
► Instagram: / betta_tech
► Canal Secundario: / @forkdebettatech
► Slack: bit.ly/33gaDDM
👨🏼‍🏫 MIS CURSOS 👨🏼‍🏫
👽 Curso de iniciación a la programación con JavaScript:
► bit.ly/3kr4bTc
👕 MERCHANDISING DEL CANAL:
► Tienda KZread: / bettatech
► Tienda Teespring: teespring.com/stores/bettatec...
⭐️ AFILIADOS ⭐️
🎁 7% Descuento en HOSTINGER (Código BETTATECH)
► www.hostg.xyz/aff_c?offer_id=...
🐾 MacPaw (CleanMyMacX):
► macpaw.audw.net/c/2523912/941...
🎵 TODA la música es de EpidemicSound:
► www.epidemicsound.com/referra...
✉️ CONTACTO PROFESIONAL:
► Respuesta no garantizada:
bettatechyt@gmail.com
📚 LIBROS 📚
Design Patterns
► amzn.to/39XuQlq
Head First Design Patterns
► amzn.to/2uq6XUq
Refactoring
► amzn.to/2SQnf2c
Clean Architecture
► amzn.to/3bZVonJ
Clean Code
► amzn.to/32WVKq3
Introduction to Algorithms
► amzn.to/34SyVFP
Cracking the Coding Interview
► amzn.to/2QkdwC6
⏱ ÍNDICE:
• 0:00 - Introducción
• 1:52 - El Problema
• 2:58 - Diseño inicial
• 5:47 - Problema de concurrencia
• 9:41 - Estimación de tamaño
• 11:59 - Conclusión
#roadTo100k

Пікірлер: 218

  • @BettaTech
    @BettaTech3 жыл бұрын

    Al final del vídeo os dejo un problema que resolveremos en el siguiente de la serie! Dejarme en los comentarios las propuestas de solución y quizá las revisamos! :D

  • @alvarocespedes9890

    @alvarocespedes9890

    3 жыл бұрын

    Manos a la obra! 😎👌

  • @boomboom-9451

    @boomboom-9451

    3 жыл бұрын

    Aquí te adjunto la mía, aunque te la mencioné en otro comentario. He usado stacks y hash tables, tiene un coste de O(n). const input = process.argv[2].split(''); let hashTable = { '(': ')', '[': ']', '{': '}' }; let stack = []; for (let i = 0; i if (input[i] in hashTable) { stack.push(input[i]); continue; } if (stack.length != 0 && input[i] == hashTable[stack[stack.length - 1]]) { stack.pop(); if ( i+1 == input.length ) { console.log(true); return true; } continue; } console.log(false); return false; }

  • @petro13cid

    @petro13cid

    3 жыл бұрын

    @@boomboom-9451 Considero que sería preferible determinar si la cadena es correcta poniendo un if ( stack.length == 0 ) después de for, así evitarías ejecutar ese if ( i+1 == input.length ) por cada vez que se saque un elemento de la pila. Dentro del for se pondría una condición y un break para cuando el caracter de cierre no seaa correcto. Pero buena solución

  • @MaximoPower2024

    @MaximoPower2024

    3 жыл бұрын

    Una pila.

  • @pepeluis766

    @pepeluis766

    3 жыл бұрын

    No me gusta mucho mi solución, funciona para el ejemplo dado (aunque fallaría si se abren dos elementos del mismo tipo antes de cerrarse uno de ellos). Una mejor sería el uso de substring como si de pilas se tratatran, quitando la recursión y teniendo en cuenta si se abren varios elementos del mismo tipo, pero ahora no tengo tiempo!! Bueno, ahí va mi código: //-------------------------------------------------------------------------------------------------------------------------------------------- public class Ejemplobusqueda { public static boolean comprobarTexto(char[] texto, int i, int j) { if(i>j) return true; // no queda nada que comprobar, todo bien if(i==j) return false; // solo hay una letra, no puedo encontrar el objetivo char letra = texto[i]; // letra que voy a comprobar char objetivo = ' '; // letra de cierre buscada //----------------------------- switch (letra){ case '[': objetivo = ']'; break; case '{': objetivo = '}';break; case '(': objetivo = ')';break; default: return false; } //----------------------------------------------- int k = i + 1; //empiezo a buscar desde la siguiente letra a i while(k j) // no he encontrado el caracter objetivo { return false; } else //encontré el caracter objetivo { boolean parte1 = comprobarTexto(texto, i+1, k-1); // quito las letras emparejadas y sigo comprobando if(parte1) { return comprobarTexto(texto, k+1, j); // compruebo el resto del string } else { return false; } } } //-------------------------------------------------------------------------------------------------------------------------------------------- public static void main(String[] args) { String texto = "[()]{}{[()()]()}"; String texto2 = "[(])"; boolean resultado = comprobarTexto(texto.toCharArray(),0, texto.length() -1); if(resultado) { System.out.println("correcto"); } else { System.out.println("incorrecto"); } } }

  • @victorfondevilla1424
    @victorfondevilla14243 жыл бұрын

    Hola! Una recomendación, para mejorar la escalabildiad, concurrencia y resiliencia de la solución, a menos que haya un requerimiento de actualizar datos en tiempo real, creo que deberías poder un sistema de colas entre la API y la base de datos con un (o varios) ingestor de datos. Esta cola daría persistencia a las peticiones, con lo que si en un momento dado tu base de datos colapsa por sobrecarga, no se perderían transacciones de escritura de la API. Mi recomendación (me dedico profesionalmente a diseñar sistemas) es que se empiece siempre este tipo de entrevista haciendo un requirements gathering (incluyendo límites y riesgos), que es lo que deberías usar para guiar tus decisiones arquitecturales. Mi enhorabuena por el vídeo porque no hay mucho de Systems Design en español (y te has ganado otro suscriptor)! :D

  • @ernestoviso3083

    @ernestoviso3083

    3 жыл бұрын

    Buenas, estoy de acuerdo contigo pero solo a medias. Si implementas un sistema de colas para realizar la persistencia de modo asincrono, correrías el riesgo de si en determinado momento fallaras al persisitir, perderías esta información o podrías tambien correr el riesgo de ralentizar toda la cola con una lógica de reintentos. Aquí creo que dependería en gran medida de las necesidades reales del producto, si hablamos de información que requiera cierta transaccionalidad (como la información del vuelo de un cliente) no puedes permitirte un sistema de colas sin más, sería más robusto hacerlo de forma síncrona y mejorar el rendimiento en otros aspectos. Igualmente es una opinión, pero hay otro tipo de operaciones en las que utilizar sistemas de colas puede ser mas seguro, o usar una cola persistente como la que ofrece NATS o algo así para almacenar mensajes e ir reintentandolos con cierta regularidad, pero el problema reside en que al ser de manera asíncrona es muy complejo recuperar al usuario para dicha operación.

  • @alejandroballesterosh4252
    @alejandroballesterosh42523 жыл бұрын

    Esta serie es de lo mejor, hasta ahora practicaba con los problemas de hackerank, pero las explicaciones que das, agregan muchísimo sentido y valor para quienes van empezando. Saludos desde México.

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    Gracias! Me alegra muchísimo ver que os gusta y que además os es de utilidad. :)

  • @fedegregori318
    @fedegregori3183 жыл бұрын

    Betta muchas gracias por estos videos, para estudiantes de ing son un camino hacia la luz! Saludos y ojalá siga la serie!

  • @carlosjavierbellotti6660
    @carlosjavierbellotti66603 жыл бұрын

    Muy bueno el planteo. Respecto al próximo problema creo que se puede solucionar con un stack, haciendo push en en el stack cuando tenes un carácter de apertura ((, [ o { ) y cuando son de cierre ( ), ] o }) hacer un pop comprobando que lo que acabamos de levantar de la pila se corresponda con el carácter de cierre, si no llega a corresponder o la pila se encuentra vacía al momento de hacer el pop es incorrecto. Abrazo!!!!

  • @UskoKruM2010
    @UskoKruM20103 жыл бұрын

    ¡Excelente video, Martín! Saludos! 👋🏻👋🏻

  • @19JVC68
    @19JVC683 жыл бұрын

    Lo felicito por su valiosa colaboracion para los que estamos en este mundo de la programacion, que no es saber programar, si no es saber la logica de lo que se esta haciendo, muy clara su explicacion, estaremos pendientes de sus proximos videos, Feleicitaciones

  • @FlightgearTutorials
    @FlightgearTutorials3 жыл бұрын

    Muy buen video. Yo lo que mas estoy esperando es un video CLARO (solo como tu sabes hacerlos, que lo dificil parezca facil) sobre (DI) Dependency Injection en la serie de Patrones de Diseño. Please !!! Jejeje

  • @eloscmao6945
    @eloscmao69453 жыл бұрын

    Felicitaciones, explica muy bien todo se hace fácil. Espero el próximo video. Saludos desde Colombia.

  • @javieraleangonzalez4786
    @javieraleangonzalez47863 жыл бұрын

    Ahhhh, Primer Comentario, felicidades por tus videos, cada día mejoran más (producción) y se vuelven más interesantes, Saludos desde Colombia!!!

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    Gracias y saludos desde España!! :D

  • @pablorequejo5680
    @pablorequejo56803 жыл бұрын

    He empezado a ver hace poco tus vídeos ya que son muy explicativos y ahora estoy enganchado, gran trabajo! Una pregunta soy una persona que viene de la rama mixta y desde hace unos años trabajo para una empresa de desarrollo de proyectos dentro del mundo TI. Gracias a esto ha crecido mi interés por toda la parte técnica del diseño de sistemas y me gustaría conocer cuál sería tu mejor opción para adquirir este mayor detalle técnico de diseño de sistemas y programación? Gracias!

  • @mauroquiroga225
    @mauroquiroga2253 жыл бұрын

    Muy buena toda la info que aportas y con la buena calidad que lo haces. Super agradecido, me gustan mucho esta serie de videos.

  • @ThePomelo09
    @ThePomelo093 жыл бұрын

    genial muchas gracias me sirvio mucho ! esa pregunta me la hicieron en mi ultima entrevista, en si el concepto era bastante similar: tener una aplicacación que permita al usuario visualizar y escribir un mensaje y guardarlo en la db pero esta app podian consumirla varios usuarios simultanamente.

  • @franciscojesusmartinezdura4748
    @franciscojesusmartinezdura47483 жыл бұрын

    Mola mucho esto de proponer problemas y resolver lo en el próximo vídeo 👏

  • @marcjall
    @marcjall3 жыл бұрын

    😮 top video. El mejor en Español. Compartiendo!

  • @josevicente632
    @josevicente6323 жыл бұрын

    Excelente por favor màs contenido sobre diseño stmas como este video..saludos desde Colombia!!!

  • @Swilarx19
    @Swilarx193 жыл бұрын

    Pues fue un buen video, me agrada este tipo de problemas que desarrollan habilidades para ser un buen programador, estuvo increible espero mas resoluciones así y tambien sugerencia para practicar nosotros tambien! Aún no me han preguntado ello estoy en la facultad aún pero gracias!.

  • @carsdfj
    @carsdfj3 жыл бұрын

    Excelente serie de vídeos para estudiar y la explicación va muy de la mano Gracias un saludo desde Venezuela

  • @ElIncreibleCptSpiff
    @ElIncreibleCptSpiff3 жыл бұрын

    Me encanta este tipo de contenidos. Muchas gracias, crack!

  • @marialejandrausart4162
    @marialejandrausart41623 жыл бұрын

    Dejo un tip: todo estos problemas los vez en la facultad, a mi lo que me pasa es que cuando presentas titulo es como que ni pasas por la entrevista tecnica porque en realidad si los rrhh hicieron su trabajo al leer sus programas de estudios ya esta claro, es como preguntarle a un corredor de formula uno si sabe conducir, pero si lo hacen para aquellos que son autodidactas a la marcha, va en resumen con titulo la entrevista dura minutos sin titulo la entrevistas pueden ser varias fases. Y si vez que como profesional te preguntan cosas absurdas ya como que a prender la alarma y pensarlo.

  • @joaquinvilchez5846
    @joaquinvilchez58463 жыл бұрын

    Genial!! Ojalá a puedas hacer mas ejercicios prácticos sobre diseño de sistemas, no hay mucha data de eso... Gracias

  • @kingskull619

    @kingskull619

    3 жыл бұрын

    Con neo4j xD

  • @DavidCervantes.
    @DavidCervantes.3 жыл бұрын

    Podemos tener un arreglo de variables que "abren" ({[ y otras que "cierran" )}]. Siempre podemos permitir que allá variables que abren, estás las escribimos en una pila, pero si se detecta que hay una que cierra está la tenemos que comparar con la cabeza de la pila, y si es la misma está bien, se sigue iterando a las demás posiciones haciendo lo mismo. Pienso que está podría ser una solución... Aunque tal vez no la más óptima. Excelente video!

  • @eduardomurrieta1367
    @eduardomurrieta13673 жыл бұрын

    Si es una BD relacional y declarar el ID o su identificador PK no tendría por que pasar lo de perder datos, a lo máximo a pasar es que uno de los dos de fallo. Al ser PK automáticamente tiene que ser único y no repetir, pero al final si tendrías que implementar la solución que dan en el vídeo.

  • @fernandiwxbc13
    @fernandiwxbc133 жыл бұрын

    Me gusta la solucion que diste, simple y real. De igual forma, generaria un microservicio dedicado a los vuelos (o abstraerlo por completo a un servicio de consulta y reporte y usarlos desde otros microservicios si esta tarea se piensa extender a mas entidades), y si no es mi prioridad controlar de alguna forma especifica la cola de peticiones y como atenderla usaria alguna base de datos en tiempo real o un CaaS (los cuales incluso ya manejan la logica de Key/Value) y delegar la concurrencia a un recurso dedicado a esto. Editado: Creo que para el problema del final de video, si el lenguaje lo soporta utilizaria una regular expression, pero desconozco si es la mejor alternativa.

  • @moisescaicedo4078
    @moisescaicedo40783 жыл бұрын

    Esa fue una de las preguntas en mi primera entrevista de trabajo.

  • @marianaquinteros1611

    @marianaquinteros1611

    3 жыл бұрын

    Te fue bien ?

  • @moisescaicedo4078

    @moisescaicedo4078

    3 жыл бұрын

    @@marianaquinteros1611 quede 👌

  • @samuelfarfan3062
    @samuelfarfan30623 жыл бұрын

    Muy buen video, cada vez estan mejores muchas felicitaciones

  • @pepeluis766
    @pepeluis7663 жыл бұрын

    Muy buen vídeo y solución al problema. Se me ocurren un par de optimizaciones, crear una tabla de destinos con un id autoincremental y el nombre. Luego trabajar en la tabla muchos a muchos destino-destino con los id, creo que las lecturas-escrituras y espacio de esa tabla se optimizaría. Otra mejora que se me ocurre podría ser un sistema de replicación de información con servidor de bases de datos maestro y varios esclavos. También existe la posibilidad de crear una caché en el cliente que accede a los datos (actualizando la caché de manera asíncrona) para que tenga la última versión de la base de datos. Esto puede traer problemas pero es otra opción. Gracias por el vídeo, está genial!

  • @eduardozepeda1972
    @eduardozepeda19723 жыл бұрын

    Hay un ejercicio parecido en js-assesment de github. Son una serie de problemas para evaluar el conocimiento de Javascript, están interesantes.

  • @shelu17
    @shelu173 жыл бұрын

    Diría que falta un sistema de colas como kafka , rabbit y el evento de dominio a encolar es la consulta de pares de aeropuertos/ciudades. Un saludo ! :) gran video !

  • @kaelt75
    @kaelt753 жыл бұрын

    Hola, genial todos tus videos :D, muchas gracias por ellos. Solo me quedá una duda, ¿durante la entrevista lo que tu entregaste fueron los dibujos que nos mostraste?

  • @GerentedeSistemas
    @GerentedeSistemas3 жыл бұрын

    Una de las entrevistas para un puesto laboral mas difícil que me sucedió, no fue precisamente técnica, si no fue una mesa redonda entre 5 entrevistadores y yo, todos ellos expertos en diversas áreas, tuve a mi favor que me desenvuelvo muy bien en cualquier nivel y eso fue el valor diferente por el que me dieron el puesto de Gerente de tecnologías de información y procesos para una entidad de gobierno, mas allá de mi pericia técnica y el PMP.

  • @leow375
    @leow3753 жыл бұрын

    Muy buen video betta!!

  • @Unknown971
    @Unknown9713 жыл бұрын

    Muy buen video, muy util la verdad. Me genera una duda en el punto de hacer una transaccion atomica, ya que a mi me gusta mas es estilo de tener la logica en un solo lugar (por ejemplo, generar tablas virtuales para trabajar con los datos, como por ejemplo entity framework), ya que lo considero mas ordenado que tener logica en la base de datos y en la aplicacion en si. ¿Sabrias cual seria el equivalente (o de que forma se haria) para hacer esto desde el lado de la aplicacion?

  • @Renzofranche770
    @Renzofranche7703 жыл бұрын

    Hola tengo 17 años y soy un estudiante de ingeniería informática. Tu canal me ayudó e inspiró mucho, graciaaaaaasss:)

  • @tutistar96
    @tutistar963 жыл бұрын

    Recuerdo haber visto ese problema en la materia de compiladores cuando estaba en la universidad, me dieron ganas de leer esos apuntes de autómatas y pilas.

  • @sentadoensilla
    @sentadoensilla3 жыл бұрын

    Muy buena forma de resolverlo! Yo hubiera pensado en hacer una tabla de registros tipo bitácora: bitacora(idreg int, fecha timestamp, ip text, navegador text, os text, origen text, destino text ) index (fecha, origen, destino) sin PK o FK, registrando con la API todas las búsquedas, Luego ampliar la API para que consulte dicha tabla cada N segundos, devolviendo los pares origen-destino con su frecuencia de acuerdo al mes actual o un período específico de tiempo. Claro que también se podrían saber sólo los destinos, los orígenes u otros datos de acuerdo a la tabla. El único prooblema sería que de acuerdo a la cantidad de registros, la consulta cada N segundos sería más o menos impactante para la DB.

  • @popularfan5893
    @popularfan58933 жыл бұрын

    Puedes hablar del tema seguridad, autenticacion en webservices ? Es decir que solo puedan acceder al webservices solo ciertos clientes y que ademas los datos esten de alguna manera encriptados.

  • @Kevin-et9jy
    @Kevin-et9jy3 жыл бұрын

    Molaría un video sobre ACID vs BASE y llegar un poco a las bases de datos de grafos como Neo4j

  • @dan6577
    @dan65773 жыл бұрын

    Hola, me llamo Daniel De Paz saludos desde El Salvador, me pareció bastante interesante el ejercicio que dejaste al final del video así que me puse a resolverlo, no sé si sea la mejor forma de hacerlo o esté totalmente correcto ya que solo hice algunas pruebas pero aquí lo dejo por si lo quieren revisar, lo hice en javascript: const validateBrackets = (textToTest) => { let valid = true; let charArray = textToTest.split(''); let map = new Map([ ['{',{rep:0,pos:[]}], ['[',{rep:0,pos:[]}], ['(',{rep:0,pos:[]}], [')',{rep:0,pos:[]}], [']',{rep:0,pos:[]}], ['}',{rep:0,pos:[]}], ]); let closingBrackets = new Map([ [')',{opos:['{','['],recipr:'('}], [']',{opos:['{','('],recipr:'['}], ['}',{opos:['(','['],recipr:'{'}], ]); charArray.forEach((char,index) => { map.set(char, { rep:(map.get(char)===undefined)?1:map.get(char).rep+1, pos:(map.get(char)===undefined)?[index]:[...map.get(char).pos,index], }); if(closingBrackets.get(char)){ let recipr = closingBrackets.get(char).recipr; closingBrackets.get(char).opos.forEach(c => { if(map.get(c).pos[map.get(c).pos.length-1]!==undefined) if(map.get(c).pos[map.get(c).pos.length-1]>map.get(recipr).pos[map.get(recipr).pos.length-1]) valid = false; }); map.get(recipr).pos.pop(); } }); return valid; } console.log(validateBrackets("[()([)]")); //Incorrecto console.log(validateBrackets("[()()]")); //Correcto console.log(validateBrackets("[()]{}{[()()]()}")); //Correcto console.log(validateBrackets("[(])")); //Incorrecto

  • @sadielottenwardel331
    @sadielottenwardel3313 жыл бұрын

    Me gustan mucho estos vídeos, aprendo muchísimo

  • @paumasabad1449
    @paumasabad14493 жыл бұрын

    ¡Gran video! Tengo una duda acerca de la orientación laboral: si quiero ser software developer pero elijo la mención en tecnologías de la información, me será más difícil?

  • @lucian1320
    @lucian13203 жыл бұрын

    Que buena serie de videos!

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    Gracias!!!!!!

  • @CulturaDevOps
    @CulturaDevOps3 жыл бұрын

    buenisimo este video gracias por comparti esto

  • @nicolasa.bermellferrer8025
    @nicolasa.bermellferrer80253 жыл бұрын

    Me encanta este canal

  • @gustavoandres1792
    @gustavoandres17923 жыл бұрын

    Muy bueno el video, pero si trabajas con tablas sql, podrias sin necesidad de atomizar la consultar (es decir meterla en una transaccion esperando a otra consulta), realizar un update en la cantidad haciendo UPDATE table SET cantidad +1 where key = "clave q lei", es decir la suma no depende de la concurrencia sumas 1 al valor de la cantidad q ya estaba independientemente de la lectura

  • @jonthan34
    @jonthan343 жыл бұрын

    Me gusta mucho el contenido. Por favor mantén el formato... primero intro luego publicidad 👍🏼

  • @yumix77
    @yumix77 Жыл бұрын

    Interesante video. Solo un pequeño comentario. En la solución al problema de la doble escritura en la base de datos mencionas que debe ser atómica, y en el caso de la base de datos relacional transaccional. Realmente eso no es suficiente, porque depende del aislamiento de dicha transacción. Si el aislamiento es serializable o lectura repetida si funcionaria, porque hace un lock de dicha linea de la base de datos, pero si es otro tipo de aislamiento como "read comitted" (por defecto por ejemplo en Oracle) "read uncommitted", entonces podrías tener exactamente el mismo problema, independientemente de que la ejecución sea transaccional o atómica.

  • @Dev403M
    @Dev403M3 жыл бұрын

    Gran video!!! Saludos!.

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    Gracias! 😊

  • @migcon67
    @migcon673 жыл бұрын

    Muy bueno como siempre. el universo es confuso realmente

  • @ManuelMartinez-sl7op
    @ManuelMartinez-sl7op3 жыл бұрын

    Me queda la duda al igual que a varios, ya que al hacer n^2 se piensa en una permutaciones es decir la conexión Madrid-Barcelona y Barcelona -Madrid cuentan como pares distintos, el problema inicial nos pedía que contaramos la petición en un par de aeropuertos dado, que no sería mejor pensar en un combinación es decir n! /((n-2)!2!), que daría la mitad del cálculo original, ya que da lo mismo el orden de donde se haga la petición solo importa el par de conexión???

  • @ThePomelo09
    @ThePomelo093 жыл бұрын

    Buenas, como estas? que libro, curso/tutorial completo me recomiendan para empezar de cero con diseño de sistemas?

  • @arnaucastellvi
    @arnaucastellvi3 жыл бұрын

    Se puede reducir un poco el tamaño suponiendo que el origen y el destino no sera el mismo aeropuerto, por lo que serian 40.000 X 39.999 pares. Por otra parte, yo habría presentado los datos en capacidades binarias (MiB y no MB), pero eso va a gustos.

  • @andresandreti

    @andresandreti

    3 жыл бұрын

    siendo más rigurosos seria permutado 2, además tampoco se especificó si se debe diferenciar los viajes de A a B y de B a A, si no es necesario seria combinado 2.

  • @estrelladelsurjudiciales5259
    @estrelladelsurjudiciales52592 жыл бұрын

    Buenas humilde aporte, si para identificar un aeropuerto solo se cuenta con 3 caracteres, ejemplo el primer aeropuerto AAA y el ultimo ZZZ por combinatoria ( son 26 si no contamos la Ñ) 26 X 26 X 26 = 17.576, según comentas te informaron que son 40.000 aprox. así que estimo que serian del tipo char y también numéricos, ( letras 26 + números 10 ) 36 X 36 X 36 = 46.656.- (este nro es el máximo alcanzable ) Esta forma de verlo puede ayudar a estimar, si es que no se cuenta con el dato de que hay 40.000 aeropuertos,. O para saber cual seria la maxima capacidad posible (46.656 todas las combinaciones ) y la capacidad real los aeropuertos funcionando ( 40.000 aprox ).-

  • @22panchy
    @22panchy3 жыл бұрын

    Bonito problema final. Existen dos aproximaciones. La corta y bonita sería una función recursiva pura, pero hay que tener cuidado con el tamaño de la pila de llamadas, por otro lado está la forma liosa pero más eficiente, que sería una función iterativa.

  • @kingskull619
    @kingskull6193 жыл бұрын

    El problema se soluciona con un stack Iteras por cada carácter, si es un carácter de apertura "( [ {" lo metes al stack. Si es de fin ") ] }" haces pop, y checas, si el carácter del stack no coincide con el de fin (paréntesis con paréntesis y así) si no coincide está mal y lanzas un error. Si si está bien continuas. Si al final de iterar el strings el stack está vacío está correcto, si aun tiene valores está mal.

  • @EzequielRegaldo
    @EzequielRegaldo3 жыл бұрын

    Se me ocurre un modelo mejor : { from : (aeropuerto), to : (aeropuerto), flights : (number) } con eso podrías usar un grafo :P

  • @francocaballero4835
    @francocaballero48353 жыл бұрын

    Excelente!!!

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    Gracias!!!

  • @LuisLopez1099llg
    @LuisLopez1099llg3 жыл бұрын

    El problema del final me lo dejaron de tarea en la universidad :0 Jaja

  • @jorgelopezcabrera1658
    @jorgelopezcabrera16583 жыл бұрын

    Para el problema de la concurrencia, yo lo resolvería con un procedimiento almacenado en la DB, la base de datos automáticamente se encargaría de gestionar la cola de ejecución del procedimiento y mantener la secuencia de los datos

  • @marioagostinelli5827
    @marioagostinelli5827 Жыл бұрын

    12:58 en este caso, no seria necesario tambien contabilizar desde B-A? para diferenciar el lugar de origen/destino?

  • @LuisRuizHalo
    @LuisRuizHalo3 жыл бұрын

    Una opción práctica para un sistema con una buena carga sería poner un collector de datos con un simple endpoint (potencialmente pudiendo ser gRPC streaming unidireccional) que envíe datos periódicamente de los vuelos a través de un stream (AWS Kinesis o Apache Kafka), el cual contenga un grupo de consumidores donde se encuentren los nodos workers (procesadores) que se encarguen de agregar los datos en el data lake Key-Value (potencialmente pudiendo ser una tabla AWS DynamoDB). Cabe recalcar que, como siempre, nuestros procesadores deben cumplir con la regla de idempotencia. Para finalizar, la aplicación GUI de analítica hipotética lee de este data lake los agregados en tiempo real con algún websocket o usando igualmente gRPC con streaming full-duplex.

  • @LuisRuizHalo

    @LuisRuizHalo

    3 жыл бұрын

    PD: Se puede tener una arquitectura completamente serverless con AWS Kinesis o SNS/SQS, Lambda, DynamoDB, Route53, CloudFront y API Gateway. (Sin contar S3 con CloudFront para algún sitio web para la aplicación GUI)

  • @meiffel4874
    @meiffel48743 жыл бұрын

    tengo una duda... es valido responder con un diagrama de flujos? casos de uso? es que ando viendo la materia y no veo donde entran estrcutruas si todo es codigo y corridas en frio :C , muchas gracias por el video esta genial tu canal!

  • @sebasppp
    @sebasppp3 жыл бұрын

    Nuevo sub. Gracias

  • @andresmauriciovalderramagi6138
    @andresmauriciovalderramagi61383 жыл бұрын

    Los pares de aeropuerto a-b no seria 40000 combinado 2?? O en su defecto 40000 permutado 2??

  • @Luis-ww1kx
    @Luis-ww1kx3 жыл бұрын

    10:00 no es n al cuadrado, es n * (n - 1); esto es porque no puedes viajar desde el punto a al a... ya estás ahí 😅

  • @gidraxl.6082

    @gidraxl.6082

    3 жыл бұрын

    tienes razon, sin embargo es mejor utilizar una cota superior fácil de usar como n * n y ademas, es más comprensible

  • @rbjmalca2

    @rbjmalca2

    3 жыл бұрын

    de razón no le llamaron

  • @VallenatoDelAlma

    @VallenatoDelAlma

    3 жыл бұрын

    Tenia el mismo comentario, chevere la aclaración, buenos videos saludos

  • @grl4171

    @grl4171

    3 жыл бұрын

    @@gidraxl.6082 ¿por qué es más comprensible?, todas las combinaciones posibles es n por n --> n^2 de ahí quitas lo que por condiciones de contorno no se puede dar , no valen combinaciones contigo mismo le restas n (que son los elementos únicos) no te valen permutaciones divides entre dos. Es combinatoria básica, cualquier ingeniero debería pensar así y no en una fórmula al aire genérica, porque cada problema es un mundo.

  • @gidraxl.6082

    @gidraxl.6082

    3 жыл бұрын

    @@grl4171 claro pero a efectos prácticos se usa una cota superior sencilla. En este caso n^2. Si quieres mas información investiga sobre "Big-O notation"

  • @aigon777
    @aigon7773 жыл бұрын

    Para no generar bloqueos, si este proceso no fuese crítico, podrías usar una cola de mensajes. Publicas ahí una nueva "búsqueda", y otro proceso se encargaría de ir consumiendo esa cola de mensajes. Puede parecer muy lento, pero realmente funcionan muy rápido y son muy versátiles.

  • @aigon777

    @aigon777

    3 жыл бұрын

    Y como seguramente tengas los aeropuertos en otra tabla, puedes hacer que la clave sean id de aeropuerto A, e id de aeropuerto B, reduciendo el tamaño de la base de datos.

  • @SolucionesELP
    @SolucionesELP3 жыл бұрын

    Tal vez usando diccionario en python con key los aeropuertos A y B, el valor las veces que se repite.

  • @MaximoPower2024
    @MaximoPower20243 жыл бұрын

    Como no sé mucho de bases de datos, mi solución al problema fue otra: tenemos un conjunto de arrays, pongamos 100 diferentes, y cada uno de ellos tiene 100 valores, consistentes a su vez en un array inicialmente vacío. Cada vez que entra una nueva consulta de aeropuertos del frontend, obtenemos un número aleatorio de 1 a 10.000, creamos un objeto que represente la solicitud (el más simple sería una cadena de 6 caracteres) y lo añadimos al array correspondiente al número aleatorio. De esta manera, podríamos tener a miles de usuarios enviando datos a la vez sin apenas colisiones (un porcentaje despreciable). Luego, cada cierto periodo de tiempo, por ejemplo una hora, copiariamos los arrays, los reseteariamos, y con los datos de las copias haríamos la operación de incremento en la base de datos. Con esto tanto las colisiones como el tiempo de inactividad sería mínimo. Hay que tener en cuenta que hacer muchas operaciones pequeñas en una base de datos supone una gran cantidad de tiempo, lo que su vez incrementa la probabilidad de que se produzcan cuellos de botella. Por eso me parece interesante solucionar el asunto en el nivel previo, en lo que sería la RAM.

  • @lucaslorenzo361
    @lucaslorenzo3613 жыл бұрын

    Alguien más está viendo este video sin saber casi nada de programación y no entendiendo una mierda salvo los nombres como "sql, mongo, etc" ? jajaja quisiera saber tanto como esta persona :( buenos videos crack!

  • @pablopalma2862

    @pablopalma2862

    3 жыл бұрын

    La concurrencia es cuando dos procesos se ejecutan al mismo tiempo. El problema con esto es que al haber mas de 1 proceso accediendo a los mismos datos, estos pueden que no se guarden segun lo esperado y que haya algun conflicto. Por eso la solucion propuesta por Betta es que solo se permita acceder a la BD de modo sincrono, que no haya mas de un hilo a la vez modificando los datos. Eso para evitar posibles conflictos con los datos. Depues hablo de la estimación del tamaño, aca dijo que cuanto es el peso aproximado que puede llegar a tener la base de datos, asi como cualquier archivo, una musica, una imagen, en este caso una base de datos. El calculo los posibles datos que se pueden guardar en ella y asi sacar una estimacion de lo que va a pesar la base de datos. Igual si no entendiste el video, menos creo que entendas esto jaja, pero bueno volve a ver el video e intenta buscar en el google lo que no tendas bro. Suerte y a seguir dandole!

  • @Soy_Kenneth1993
    @Soy_Kenneth19933 жыл бұрын

    Yo había hecho un Dashboard con algo parecido a lo que presentaste

  • @CragCode
    @CragCode3 жыл бұрын

    El ejercicio del final ya lo habia visto en codewars

  • @johncerpa3782
    @johncerpa37823 жыл бұрын

    Buen video

  • @alfoorego8380
    @alfoorego83803 жыл бұрын

    7:40 Eso se resuelve si metes la actualización en una transacción

  • @dalilabenkaddour6767
    @dalilabenkaddour67673 жыл бұрын

    Aquí está mi solución al problema del final: github.com/satinfive/betta_tech_string_problem Muy interesante el planteamiento del sistema :) Muy similar a lo que se me hubiese venido a la cabeza en primera instancia, aunque agradezco la completitud del planteamiento, llegando a analizar hasta cuánto ocuparía la BD. Si bien al principio pensé en un sistema de colas, quizás, pero a lo mejor se hacía demasiado para el planteamiento del problema. ¡Gracias!

  • @ciberhormaza
    @ciberhormaza3 жыл бұрын

    yo lo habría hecho con una combinación de microservicio+logstash, podria solucionar el desafío y servir para explotar mucha más información

  • @djthdinsessions
    @djthdinsessions3 жыл бұрын

    Un redis te lo resuelve en dos patadas y ya tiene la instrucción incr que es atómica y te quitas el problema de concurrencia, gestion de bbdd y demás de un plumazo

  • @kenethsandoval2641
    @kenethsandoval26413 жыл бұрын

    ¿Para cuando los directos en twitch?😎

  • @JuanCamiloSutachanTrujillo
    @JuanCamiloSutachanTrujillo3 жыл бұрын

    El número de pares que tendrías no sería 40000 choose 2? Porque que n^2 sólo es el número de formas en que podemos combinar todos los elementos.

  • @lolimilesi1291
    @lolimilesi12913 жыл бұрын

    el ejercicio se puede hacer con una expresión regular?

  • @erickhilario8782

    @erickhilario8782

    3 жыл бұрын

    He visto que sí es posible

  • @MinombreesSergio
    @MinombreesSergioАй бұрын

    Pues no sé yo, yo lo hubiera planteado guardando cada búsqueda con su IP, ubicación, y un token de usuario, para luego tener esa data para minería o para Big Data, pero claro, depende mucho de lo que necesite el producto.

  • @Alkchofa
    @Alkchofa3 жыл бұрын

    Me gusta pensar este problema con una base de datos basada en grafos.. Por alguna razón no sería una buena idea? 🤔

  • @pablino234
    @pablino234 Жыл бұрын

    Todo es UML de casos de uso cierto ?

  • @relarbaelish
    @relarbaelish3 жыл бұрын

    No deberían ser 7 bytes para el key? Faltaría el guión que separa a los dos aeropuertos. Por cierto, el problema final creo recordar que se resuelve con pilas (creo haberlo visto en Sintaxis y Semántica de los Lenguajes).

  • @heatxtm

    @heatxtm

    3 жыл бұрын

    te puedes ahorrar el guión, ya que siempre son 3 caracteres en los códigos de aeropuerto al leerlo después, tan solo haces el split

  • @aprende-computacion
    @aprende-computacion2 жыл бұрын

    40k^2 no creo, quizás sería 40k^2*media de conexiones de un aeropuerto no?, que opinas?

  • @maxbarcon
    @maxbarcon3 жыл бұрын

    Problema: Tendría una variable para cada caracter y iteraría por la string, cada vez que me encuentre un carácter abierto ( [ { le sumo 1 a su correspondiente variable y si está cerrado ) ] } le resto 1, en caso de que cualquiera de las variable sea negativa significa que se ha cerrado más veces de las que se ha abierto y termino el bucle y devuelvo false, si se termina el bucle y cualquiera de las variables es mayor que 0 significa que se ha abierto más veces de las que se ha cerrado y devuelvo false, si no, pues es que es correcto :D

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    Cómo se comporta tu algoritmo con el siguiente string 🤔? [{]} (debería dar false porque no está bien construido)

  • @maxbarcon

    @maxbarcon

    3 жыл бұрын

    @@BettaTech Buff esto me complica las cosas. No se si se puede continuar como lo estaba haciendo pero tengo otra solucion :) Lo que haría sería una pila de carácteres y cada vez que llegue un carácter abierto se pondría en la pila, cuando llegue uno cerrado, mirará en la cima y si es su carácter opuesto lo "quitas" de la pila, en caso contrario o en el caso que la pila no quede vacía al final de la iteración, es que no es correcto.

  • @joaquinllallire6744

    @joaquinllallire6744

    3 жыл бұрын

    @@BettaTech Si pongo esa cadena efectivamente sale false. Lo hice con Javascript tu creas que lo puedas revisar he probado con varias cadenas y hace la validación correctamente. Te dejo el link del código paiza.io/projects/CcIW9gY6Y9YxpgXS3Cl-IQ#&togetherjs=kf8MTAe0Uq

  • @junama
    @junama3 жыл бұрын

    16 Gb de sistema concurrente me parece que puede haber cuello de botella en el motor de base de datos, depende de cuántas búsquedas por segundo se hagan, yo empezaría a mirar sistemas cloud que aceptaran colas de mensajes, y que cada mensaje fuera a una función lambda creada para cada par de asociaciones (limitada a concurrencia 1), y desde ahí simplemente crear un archivo en DynamoDB e ir incrementándolo en cada llamada. Y a pesar de que Mongo te da opción para incrementar, y veo bien comentarlo, creo que en rendimiento en paralelo pierde mucho

  • @pablopalma2862

    @pablopalma2862

    3 жыл бұрын

    Si 16 gb de datos, cada consulta puede demorar una eternidad, imaginte si son miles de consultas por segundo. Te hago una consulta bro, si los datos se acceden de forma asincronica en diferentes hilos, supuestamente se dice que es mas rapido que acceder de forma sincrona, ¿esto es cierto? si fuese falso es preferible que los datos se accedan de forma secuencial y no paralela. Así mentenemos integros los datos sin causar algún conflicto creo yo

  • @JessHilario
    @JessHilario3 жыл бұрын

    Buen video, ese ejercicio recuerdo haberlo hecho en la universidad aunque la verdad no recuerdo como lo resolví xD así que te dejo mi re-interpretación de la solución en JS codesandbox.io/s/problema-bettatech-dr7oj?file=/src/index.js saludos!

  • @marlon5013
    @marlon50133 жыл бұрын

    Hola, yo lo solucionaría usando un stack, algo más o menos así. static String isBalanced(String stringToCheck) { Stack stack = new Stack(); for (char currentChar : stringToCheck) { if(isOpening(currentChar)) stack.push(currentChar); else if(stack.isEmpty()) return "INCORRECTO"; else if(isComplement(stack.top(), currentChar)) stack.pop(); else return "INCORRECTO"; } if(stack.isEmpty()) return "CORRECTO"; return "INCORRECTO"; }

  • @jcoucelanga4373

    @jcoucelanga4373

    3 жыл бұрын

    ciclomatic complexity over 5 please review your code :D

  • @PositronQ
    @PositronQ3 жыл бұрын

    Se que esto es algo de pila y se necesita conocimientos de paréntesis balanceados en donde si lo hacemos en Python lo haría con la librería import pila

  • @PterPmntaM
    @PterPmntaM3 жыл бұрын

    Buen video amigo, sirven mucho este tipo de videos, ya que no todo es programar y por que si, pero tengo una duda, ¿Cuál sería la razón de guardar el nombre de los aeropuertos por siglas acorde a sus nombres?, hago dicha pregunta, por que no le veo sentido a eso, me explicaré más abajo. Dicho problema si es para un aeropuerto, que debe serlo, ya ellos deben contar con la información de los aeropuertos, o al menos de los cuales a donde envían vuelos y de donde llegan, aunque por otro lado, viéndolo, parece un problema de una empresa de venta de pasajes para los aviones, el cual también, ya deben contar con una gran cantidad de dichos registros de aeropuertos por ciudad, por ende deben tener ya una tabla en la base de datos de los nombres de las ciudades, que a su vez, deben estar asociadas a países, y que a su vez cada ciudad debe tener asociada su aeropuerto. Entonces, si lo que se desea es ir acumulando el número de veces que alguien consulta un vuelo, guardando la ciudad de donde sale el vuelo hasta donde va a llegar, no bastaría con guardar el código de la ciudad de salida con la de destino y otro campo con un número entero de las veces de la consulta, ósea: Barcelona (001) - Madrid (002) - 5 Los números al lado de cada ciudad serian los códigos de registros en sus tablas de origen, y serian estos los que se guardan, o más bien, serian llaves foráneas en dicha tabla nueva, que se podría llamar **Consultas_Solicitudes**

  • @MaximoPower2024

    @MaximoPower2024

    3 жыл бұрын

    Con eso consigues cambiar una cadena de 3 caracteres por un entero en el intervalo 1-40.000. No tengo muy claro que valga la pena. Sobre todo si piensas que pueda haber varios frontend diferentes llamando a las apis, y que si uno de ellos tiene los códigos equivocados, vas a corromper todos los datos.

  • @PterPmntaM

    @PterPmntaM

    3 жыл бұрын

    @@MaximoPower2024 No pueden existir errores si la información, ya que estás tomando datos que provienen de una tabla principal, la cual seria aeropuertos, por llamarla así, si tienes errores, entonces proviene de la principal, esta proviene de la tabla principal, y una de las cosas que las bases de datos buscan es evitar la redundancia, por eso pregunto, cuál es el sentido de guardar los nombre si ya están. Por otro lado, con relación a los enteros, ya también antes me lo preguntaba, y pasa que las consultas que se realicen sobre valores enteros, resultan ser más rápidas que si es por texto o cadenas de texto, por eso muchas veces puedes ver que una tabla la dejan con campos autoincrementales, por que resulta práctico por un lado, y al momento de consulta resulta más rápido. Pero aclaro, eso es como yo lo haría, solo guardo el código de cada aeropuerto y de la ciudad, y otro campo que seria como un contador de cuantas veces han realizado dicha consulta.

  • @MaximoPower2024

    @MaximoPower2024

    3 жыл бұрын

    ​@@PterPmntaM Piensa una cosa. Cada web de reserva de vuelos tiene un frontend que tiene que comunicarse con la Api que interactúa con la base de datos. ¿Cómo haces para que todas esas webs, pongamos que sean 100 ó 200, tengan sincronizada la misma tabla de aeropuertos, y nunca se produzcan errores? Sin duda en un mundo perfecto es posible lograrlo, pero en el mundo real los errores suceden. Por ejemplo, tal vez algunas webs tarden en actualizar el cierre de algún aeropuerto o la creación de alguno nuevo. Ahí se pueden deslizar errores que con las cadenas son muchos más difíciles. El eslabón débil de este sistema es la base de datos, debido al riesgo de que se creen cuellos de botella o se pierdan datos. Crear un nuevo punto débil para lograr una pequeña ganancia en eficiencia puede ser un error. No siempre es adecuado hacer las cosas de la manera más eficiente posible.

  • @PterPmntaM

    @PterPmntaM

    3 жыл бұрын

    @@MaximoPower2024 Creo que estás mezclando dos cosas una cosa es el front end y otra es el back, el front yo puedo decidir que se muestra y que no, pero si las 100 o 200 webs que existen se alimentasen de una misma empresa que diseña todo, y ocurre un error, el error va a duplicarse si duplicas la información. Voy a explicarte con más detalle y con otro ejemplo para que entiendas: Países, Ciudades, Aeropuertos. Un País tiene una relación de uno a muchas ciudades, ósea de 1 a n. Por otro lado una ciudad puede tener uno o varios aeropuertos, ya que no se especifica en el problema, entonces se podría convenir que una ciudad tiene un solo aeropuerto, entonces es una relación de uno a uno. Si se necesita tener un registro de cuáles son las consultas que las personas tienen tanto de salida del vuelo como destino, yo no necesito guardar el nombre del aeropuerto, por que para eso le doy un código único que lo identifique, y lo mismo a cada ciudad y a cada país, así me evito que por alguna razón una ciudad se llame igual que otra, por que eso puede pasar, o quien sabe si un aeropuerto, se llegue a llamar igual que otro, vaya uno a saber cosas a futuro. Entonces si ya tengo un código único, simplemente registro los códigos y la cantidad de veces que se realiza dicha consulta la voy actualizando. Ahora si hablas de que el front, yo en el front lo que veo que hacen esas páginas de las empresas, es ponerte un menú dropdown o lista desplegable donde salen el nombre de las ciudades acorde a un país que tú eliges como destino y como salida del vuelo. Entonces, tú en el menú puedes ver Los nombres de los países y ciudades, pero al momento de darle consultar o que se actualice la página, ya que puede tener un evento que se ejecute cuando cambie la información en el menú desplegable, lo más seguro es que envíen el código único de cada ciudad y país, y estoy casi seguro que es numérico.

  • @MaximoPower2024

    @MaximoPower2024

    3 жыл бұрын

    @@PterPmntaM Los códigos en forma de cadenas de 3 letras de los que habla en el libro son códigos únicos que representan a los aeropuertos. Que en algunos casos coincidan con nombres de ciudades es irrelevante para el problema que estamos tratando. Tanto la solución que propones tú como la que se propone en el vídeo usan códigos únicos para los aeropuertos. La diferencia es que en tu solución, cambiar una cifra en algún sitio va a generar un error potencialmente más difícil de detectar. ¿Vale la pena a cambio de un poco más de eficiencia? Puede ser. Yo pienso que no.

  • @alfoorego8380
    @alfoorego83803 жыл бұрын

    3:11 No entiendo ese (1) Es un ejemplo de la respuesta que obtiene?

  • @danielnatsu

    @danielnatsu

    3 жыл бұрын

    Así es. Ese 1 representa la cantidad de Pares-Aeropuertos que se han consultado. Él escribió 1 sólo a manera de ejemplo llegado el caso donde sólo se hubiera realizado una única consulta entre el par de aeropuertos seleccionado.

  • @vidasimple6611
    @vidasimple66113 жыл бұрын

    9:51 40mil al cuadrado? 🤔 Si no me equivoco sería factorial, ya que descartas los que salen y van al mismo sitio. Si tenés 3 aeropuertos, A, B y C tenemos los pares A-B, A-C, B-C, B-A, C-A y C-B... 3! No 3cuadrado (no contas A-A ni B-B ni C-C)

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    Seria N * (N - 1), pero cuando te acostumbras a hacer cotas superiores, acabas simplificando casi todo como si fuera asintótico, que es lo que me ha pasado aqui xD (O(N*(N-1)) es equivalente a O(N*N))

  • @rafaelpereiraarias
    @rafaelpereiraarias3 жыл бұрын

    Para cuando un video con el canal @holamundo?

  • @compartelo007
    @compartelo0073 жыл бұрын

    Aquí os dejo mi versión, hecho en Java, algo más verboso que cuando usamos javascript o python. Saludos github.com/ChorriCode/validate-pairs/blob/main/MainClass

  • @flavioe.salasm.9922
    @flavioe.salasm.99222 жыл бұрын

    todo esto se resuelve con programacion del lado del servidor de bases de datos... procedimientos almacenados

  • @jonathanhernandezcastellan1212
    @jonathanhernandezcastellan12123 жыл бұрын

    El caso de uso

  • @finnelhumano3326
    @finnelhumano33263 жыл бұрын

    Creo que esto se llama el problema de los lectores y escritores en programacion concurrente.. Se resulve con semaforos o monitores (al menos asi me lo enseñaron a mi)

  • @javiergavilanmerida2133
    @javiergavilanmerida21333 жыл бұрын

    Se que son muy tontos, pero me gustan este tipo de problemas cortos xD: @Centurion me ha inspirado a una solución mucho más simple que la que había ofrecido al principio (aunque también sería más ineficiente): public boolean resolve(String text) { while( mustContinue( text )) { text = text.replace( "()", "" ) .replace( "[]", "" ) .replace( "{}", "" ); } return text.isEmpty(); } private boolean mustContinue(String text) { return text.contains( "()" ) || text.contains( "[]" ) || text.contains( "{}" ); } Dejo la antigua también de todas formas porque creo que es más optima xD: private char[] inputs = new char[] { '(', '[', '{' }; public boolean resolve(String text) { LinkedList outs = new LinkedList(); for ( char c : text.toCharArray() ) { if ( isIn( c ) ) { outs.addLast( toOut( c ) ); } else { if ( outs.isEmpty() || outs.removeLast() != c ) { return false; } } } return outs.isEmpty(); } private boolean isIn(char c) { for ( char in : inputs ) { if ( c == in ) { return true; } } return false; } private char toOut(char c) { switch ( c ) { case '(': return ')'; case '[': return ']'; case '{': return '}'; default: throw new IllegalArgumentException( "Caracter '" + c + "' no reconocido" ); } }

  • @edgar1906

    @edgar1906

    3 жыл бұрын

    Por lo que veo...usaste el LinkedList como un Stack no? Una pregunta, crees que seria buena idea utilizar la interfaz "Stack" de Java como una referencia polimorfica asi: "Stack outs = new LinkedList();"?? O incluso utlilizar el propio Stack de java en vez del LinkedList?? Lo siento por tantas preguntas, estoy aprendiendo esto apenas XD

  • @javiergavilanmerida2133

    @javiergavilanmerida2133

    3 жыл бұрын

    @@edgar1906 Creo que te estás confundiendo, no existe ninguna interfaz "Stack" en java, lo que existe es la interfaz "Deque" (y si, la verdad es que en mi opinión, y en general, es mejor usar siempre interfaces si no vamos a necesitar métodos propios de la implementación, es solo que no suelo necesitar usar colas, así que cuando lo hago tiro a lo directo y uso LinkedList directamente xD). También existe la clase "Stack", que extiende de Vector y es synchronized, pero normalmente se desaconseja su uso precisamente por ello. Stack pertenece a la API antigua y es preferible utilizar LinkedList. De hecho, incluso para casos donde necesites que la lista soporte concurrencia, se aconseja el uso de Collections.synchronized(Collection) u otras colecciones que ya sean concurrentes en lugar de las clases que extienden de Vector (en general se desaconseja el uso de synchronized a nivel de método, de ahí viene todo). Como curiosidad, aunque existen otras implementaciones de Deque, normalmente para colas prefiero usar LinkedList porque internamente tiene una estructura de nodos enlazados, por lo que añadir o quitar elementos del principio o el final es muchísimo más "eficaz" en LinkedList que en otras implementaciones que tienen que hacer copias del array interno. Si te vas al código de LinkedList podrás ver a lo que me refiero: public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable { transient int size = 0; /** * Pointer to first node. */ transient Node first; // Cuando quieres trabajar con elementos del principio, ya sea añadir o borrar, se trabaja con este nodo /** * Pointer to last node. */ transient Node last; // Cuando quieres trabajar con elementos del final, ya sea añadir o borrar, se trabaja con este nodo Por otro lado, si lo que quieres es acceso aleatorio o iterable, uso ArrayList, que es poco más que un Wrapper de un array

  • @edgar1906

    @edgar1906

    3 жыл бұрын

    @@javiergavilanmerida2133 Ahh si, esa interfaz, pense que tambien habia Stack, pero creo que la confundi con la clase xD. Ohh no sabia que era de la API antigua, ya entiendo. Es que he visto que mucha gente sigue usando Stack, pero ahora veo lo que tu dices jaja. Tambien vi que puedes utilizar el LinkedList como un Queue, aparte Java no tiene una clase Queue (que yo sepa) como C#. Gracias!

  • @espinetegarcia4959
    @espinetegarcia49593 жыл бұрын

    En python se resuelve ese problema con un diccionario y una lista :D string = '[()]{}{[()()]()}' pairs = { '(' : ')', '[' : ']', '{' : '}' } last_seen = [] for n, char in enumerate(string): if char in pairs.keys(): last_seen.append(char) elif len(last_seen) and pairs[last_seen[-1]] == char: last_seen.pop(-1) else: print(string) print((n)*' ' + '^') exit(0) print('Correcto')

  • @kketoo_
    @kketoo_3 жыл бұрын

    Me ha gustado mucho la idea de proponer un problema. Te mandamos la solución y lo comentas en el siguiente video?

  • @BettaTech

    @BettaTech

    3 жыл бұрын

    En el siguiente video propondre una solución y enseñare las que me hayan parecido interesantes ☺️

Келесі