Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

425
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda