Retos de Algoritmos con Apuntadores en Python
Clase 17 de 35 • Curso de Algoritmos Avanzados: Patrones de Arrays y Strings
Ahora vamos a poner en práctica todo lo que hemos aprendido durante este módulo con algunos retos. ¡Empecemos! Espero tus soluciones en la sección de aportes con tu lenguaje preferido, también puedes ver y aportar a las soluciones de tus compañeras y compañeros. 👨🚀🚀
Algunos ejemplos de casos en los que se puede utilizar este patrón son:
- Para encontrar una subcadena que cumpla ciertas condiciones, puedo usar 2 apuntadores y avanzar uno mientras parece una posible subcadena, mientras que el otro indica donde inicia la subcadena.
- Para comparar elementos en dos listas puedo usar 2 punteros, cada uno de estos apuntadores tiene noción del punto actual en una de las listas.
- Para mover y ordenar los elementos “in place”, puedo tener apuntadores para tener noción de los elementos ordenados y los que no.
1. Mover ceros al final
Dada la lista de enteros nums
, mueve todos los ceros al final de la misma, manteniendo el orden relativo de los elementos no nulos.
Reto: reordena los valores “in place”, sin hacer una copia de la lista.
Ejemplo 1:
# Entrada: nums = [0,1,0,3,12] # Salida: [1,3,12,0,0]
Ejemplo 2:
# Entrada: nums = [0] # Salida: [0]
2. Invertir string
Escribe una función que invierta una cadena. La cadena de entrada se da como un arreglo de caracteres.
Reto: hacerlo modificando la lista de entrada con O(1) de memoria extra.
Ejemplo 1:
# Entrada: s = ["h", "e", "l", "l", "o"] # Salida: ["o","l","l","e","h"]
Ejemplo 2:
# Entrada: s = ["H", "a", "n", "n", "a", "h"] # Salida: ["h","a","n","n","a","H"]
3. Reordenar colores
Dado un arreglo nums
con n
objetos de color rojo, blanco o azul, ordénalos en su lugar para que los objetos del mismo color sean adyacentes, con los colores en el orden rojo, blanco y azul.
Utilizaremos los enteros 0, 1 y 2 para representar el color rojo, blanco y azul, respectivamente.
Reto 1: debes resolver este problema sin utilizar la función de ordenación de la biblioteca.
Reto 2: ¿podrías idear un algoritmo de una sola pasada utilizando solo un espacio extra constante?
Ejemplo 1:
# Entrada: nums = [2,0,2,1,1,0] # Salida: [0,0,1,1,2,2]
Ejemplo 2:
# Entrada: nums = [2,0,1] # Salida: [0,1,2]
4. Invertir vocales
Dada una cadena de caracteres, invierte solo todas las vocales de la cadena. Las vocales son 'a', 'e', 'i', 'o' y 'u', 'A', 'E', 'I', 'O', 'U'.
Ejemplo 1:
# Entrada: s = "hola" # Salida: "halo"
Ejemplo 2:
# Entrada: s = s = "leetcode" # Salida: "leotcede"
5. Cuadrados de un arreglo ordenado
Dado un arreglo de números enteros ordenados en orden ascendente, devuelve una matriz de los cuadrados de cada número ordenados en orden no decreciente.
Ejemplo 1:
# Entrada: nums = [-4,-1,0,3,10] # Salida: [0,1,9,16,100] # Explicación: Después de elevar al cuadrado, el arreglo se convierte en [16,1,0,9,100]. # Después de ordenar, se convierte en [0,1,9,16,100].
Ejemplo 2:
# Entrada: nums = [-7,-3,2,3,11] # Salida: [4,9,9,49,121]
6. Validar palíndromo (con k
reemplazos)
Dada una cadena de caracteres, averigua si la cadena dada es un palíndromo o no. Puedes eliminar un carácter de la cadena. Una cadena es un palíndromo si se lee igual hacia adelante y hacia atrás.
Ejemplo 1:
# Entrada: s = "aba" # Salida: true
Ejemplo 2:
# Entrada: s = "abca" # Salida: true #Explicación: Podría eliminar el carácter 'c'.
7. Intersecciones de la lista de intervalos
Dadas dos listas de intervalos cerrados, lista1
y lista2
, donde lista1[i] = [inicio_i, final_i]
y lista2[j] = [inicio_j, final_j]
. Cada lista de intervalos es disjunta por pares y está ordenada.
Devuelve la intersección de estas dos listas de intervalos.
Un intervalo cerrado [a, b]
(con a <= b
) denota el conjunto de números reales x
con a <= x <= b
. La intersección de dos intervalos cerrados es un conjunto de números reales que está vacío o representado como un intervalo cerrado. Por ejemplo, la intersección de [1, 3]
y [2, 4]
es [2, 3]
.
Ejemplo 1:
# Entrada: firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]] # Salida: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
Ejemplo 2:
# Entrada: firstList = [[1,3],[5,9]], secondList = [] # Salida: []
¡Mucha suerte completando los ejercicios! En la próxima clase te compartiré mi solución en código. :muscle: