es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función contiene bucles infinitos, y todo parece estar bien.

Escribí una función que recibe como entrada una lista de intervalos y devuelve los intervalos no solapados. Aquí está la función:

def mergeOverlappingIntervals(intervals):
    new=[]
    i=0
    while i < len(intervals): 
        if intervals[i][1] < intervals[i+1][0]:
            new.append(intervals[i])
            i+=1
        else:
            p1=i
            p2=i
            while intervals[i][1] <= intervals[i+1][0]:
              i+=1
              p2+=1
            new.append([intervals[p1][0],intervals[p2][1]])
            i=p2
    return new  

Pero esta función contiene bucles infinitos. No está claro para mí por qué esta función contiene bucles infinitos y no da las salidas esperadas. Ejemplo de entradas:

interval=[
    [1, 2],
    [3, 5],
    [4, 7],
    [6, 8],
    [9, 10]
  ]

salidas=[
  [1, 2],
  [3, 8],
  [9, 10]
]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándose en el código proporcionado, la función puede encontrarse con bucles infinitos debido a un error de índice fuera de rango al verificar si el valor de final del intervalo actual es menor que el valor de inicio del siguiente intervalo. Específicamente, en la línea:

    if intervals[i][1]<intervals[i+1][0]: cuando=”” i=”” es=”” igual=”” a=”” len(intervals)-1,=”” el=”” código=”” intentará=”” acceder=”” a=”” intervals[i+1],=”” lo=”” cual=”” está=”” fuera=”” de=”” límites=”” y=”” generará=”” un=”” indexerror.=”” para=”” solucionar=”” este=”” problema,=”” una=”” posible=”” solución=”” es=”” modificar=”” la=”” condición=”” para=”” que=”” solo=”” verifique=”” si=”” el=”” intervalo=”” actual=”” se=”” superpone=”” con=”” el=”” siguiente=”” intervalo,=”” y=”” no=”” si=”” sus=”” valores=”” de=”” inicio=”” y=”” final=”” son=”” adyacentes.=”” por=”” ejemplo,=”” podemos=”” cambiar=”” la=”” línea=”” a:=”” if="" intervals[i][1]="">=intervals[i+1][0]:

    (Nota el cambio en el operador de comparación de < a >=)

    Además, el bucle while que intenta fusionar los intervalos puede causar problemas si el valor de final del intervalo actual es mayor que el valor de final del último intervalo en el arreglo (intervals[-1][1]). Una forma de manejar esto es agregar una verificación adicional en el bucle while externo:

    while i < len(intervals)-1:

    Con estos cambios, el código debería poder fusionar correctamente los intervalos y retornar la salida esperada para el ejemplo dado.</intervals[i+1][0]:`>

Comments are closed.