Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

426
Vistas
Encontrar la cadena más larga de índices y valores de elementos de matriz

No puedo resolver un problema. Tenemos una matriz. Si tomamos un valor, su índice significa ID de puerto, y el valor en sí significa la ID de otro puerto al que está conectado. Necesita encontrar el índice de inicio de la conexión secuencial más larga al elemento cuyo valor es -1.

Hice una explicación gráfica para describir el caso de la matriz [2, 2, 1, 5, 3, -1, 4, 5, 2, 3]. En la imagen, la conexión más larga es violeta (3 segmentos).

descripción gráfica

Necesito hacer una solución mediante una función getResult(connections) con un solo argumento. No sé cómo hacerlo, así que decidí devolver otra función con varios argumentos que me permitan hacer una solución recursiva.

 function getResult(connections) { return f(connections.findIndex(e => e === -1), connections, 0, []); } function f(index, cnx, counter, branches) { counter++; for (let i = 0; i < cnx.length; i++) { if (cnx[i] === index) { branches.push([i, counter]); return f(i, cnx, counter, branches); } } return branches.sort((a, b) => b[1] - a[1])[0][0]; } console.log(getResult([1, 2, -1])); // expected 0 console.log(getResult([1, -1, 1, 2])); // expected 3 console.log(getResult([2, 1, -1])); // expected 0 console.log(getResult([3, 4, 1, -1, 3])); // expected 2 console.log(getResult([1, 0, -1, 2])); // expected 3 console.log(getResult([3, 2, 1, -1])); // expected 0 console.log(getResult([2, 2, 1, 5, 3, -1, 4, 5, 2, 3])); // expected 6

De todos modos, el código no funciona completamente correctamente. ¿Podría explicar mis errores? ¿Es posible resolver el problema mediante una función con solo un argumento original?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El código no funciona completamente correctamente. ¿Podría explicar mis errores?

Estabas bastante cerca. El principal problema es que la palabra clave return delante de las llamadas recursivas finaliza el bucle for y toda la función f de forma prematura. Esto hará que visite solo los nodos en la primera rama posible, no todos.

El otro problema es que branches pueden estar vacías al final de la función, pero aún accede a [0][0] . En su lugar, devuelva la matriz completa de f y acceda a la primera tupla en getResult .

Estas dos pequeñas correcciones ya hacen que la función funcione 1 :

 function getResult(connections) { return f(connections.findIndex(e => e === -1), connections, 0, [])[0][0]; } function f(index, cnx, counter, branches) { counter++; for (let i = 0; i < cnx.length; i++) { if (cnx[i] === index) { branches.push([i, counter]); f(i, cnx, counter, branches); } } return branches.sort((a, b) => b[1] - a[1]); } console.log(getResult([1, 2, -1])); // expected 0 console.log(getResult([1, -1, 1, 2])); // expected 3 console.log(getResult([2, 1, -1])); // expected 0 console.log(getResult([3, 4, 1, -1, 3])); // expected 2 console.log(getResult([1, 0, -1, 2])); // expected 3 console.log(getResult([3, 2, 1, -1])); // expected 0 console.log(getResult([2, 2, 1, 5, 3, -1, 4, 5, 2, 3])); // expected 6
1: En realidad, hay un caso extremo en el que todavía no funciona: cuando se llama a la matriz vacía como getResult([]) , no debería generar una excepción si las branches están vacías. Esto se puede arreglar manejando específicamente ese caso con una condición if , o incluyendo la tupla [-1, 0] (sin nodo, distancia 0) en las branches .

Mejoras adicionales serían hacer también la ordenación solo una vez al final en getResult , y comenzar la búsqueda directamente con f(-1, connections, 0, []); en lugar de usar findIndex .

¿Es posible resolver el problema mediante una función con solo un argumento original? No sé cómo hacerlo, así que decidí devolver otra función con varios argumentos que me permitan hacer una solución recursiva.

Introducir una función auxiliar es una solución totalmente apropiada, ¡este enfoque es bueno!

Si bien siempre es posible escribir un esquema recursivo como un bucle con una pila explícita, eso suele ser difícil de manejar e incomprensible. Con el enfoque DFS que eligió, una función recursiva es la forma más fácil y limpia de escribirla.

Si no desea crear una variable global adicional, incluso puede declarar su función auxiliar dentro getResult . Esto también permite acceder a las connections directamente desde el ámbito superior, en lugar de pasarlo como un parámetro de función. Lo mismo se puede hacer con la variable branches :

 function getResult(connections) { const branches = []; function f(index, distance) { branches.push([index, distance]); for (let i = 0; i < connections.length; i++) { if (connections[i] === index) { f(i, distance+1); } } } f(-1, 0); branches.sort((a, b) => b[1] - a[1]); return branches[0][0]; } console.log(getResult([1, 2, -1])); // expected 0 console.log(getResult([1, -1, 1, 2])); // expected 3 console.log(getResult([2, 1, -1])); // expected 0 console.log(getResult([3, 4, 1, -1, 3])); // expected 2 console.log(getResult([1, 0, -1, 2])); // expected 3 console.log(getResult([3, 2, 1, -1])); // expected 0 console.log(getResult([2, 2, 1, 5, 3, -1, 4, 5, 2, 3])); // expected 6

En cuanto a otras alternativas y optimizaciones:

  • podría usar un BFS iterativo con una cola. Tenga en cuenta que aunque su formato de entrada generalmente es un gráfico, se garantiza que el componente conectado que atravesará será un árbol con raíz en -1 , con cada nodo secundario apuntando a su padre, nunca formando un círculo (ya que no hay ningún nodo -1 que apunta a cualquier parte).
  • en lugar de mantener todas las "ramas" (índices de nodo con su distancia) en una lista, mantenga solo la que tiene la distancia máxima que encontró hasta ahora.
  • en lugar de iterar repetidamente la matriz de connections para encontrar elementos secundarios de un nodo (el i s está haciendo referencia al index actual), cree una estructura de árbol real en una sola iteración de las connections , luego recorra ese árbol para encontrar la rama más profunda.
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda