POO + práctica · #10 de 11

Patrones de EDA + POO + práctica

Dos punteros, sumas de prefijos y diseño limpio

Por qué importa

Los patrones más la estructura convierten la programación al azar en una resolución de problemas confiable.

La idea

La mayoría de las preguntas de entrevista son un puñado de patrones: dos punteros, ventana deslizante, suma de prefijos, BFS/DFS, conteo con tablas hash, búsqueda binaria. Reconoce el patrón y luego aplica la plantilla.

Pruébalo

Dos punteros: suma de pares en un arreglo ordenado:

def two_sum_sorted(nums, target):
  l, r = 0, len(nums) - 1
  while l < r:
      s = nums[l] + nums[r]
      if s == target:
          return (l, r)
      if s < target:
          l += 1
      else:
          r -= 1
  return None

print(two_sum_sorted([1, 2, 4, 7, 11, 15], 13))
print(two_sum_sorted([1, 2, 4, 7, 11, 15], 99))
not loaded

Sumas de prefijos: responde "la suma de cualquier rango" en O(1) tras un preprocesamiento O(n):

nums = [2, 4, 5, 1, 9, 3, 7]
prefix = [0]
for x in nums: prefix.append(prefix[-1] + x)

def range_sum(l, r):
  # inclusive l, exclusive r
  return prefix[r] - prefix[l]

print(range_sum(1, 4))   # 4 + 5 + 1 = 10
print(range_sum(0, len(nums)))  # all
not loaded

POO: una pequeña pila (Stack) con anotaciones de tipo:

class Stack:
  def __init__(self):
      self._data: list = []
  def push(self, x):
      self._data.append(x)
  def pop(self):
      if not self._data: raise IndexError("pop from empty stack")
      return self._data.pop()
  def peek(self):
      return self._data[-1] if self._data else None
  def __len__(self):
      return len(self._data)
  def __repr__(self):
      return f"Stack({self._data!r})"

s = Stack()
for x in [1, 2, 3]: s.push(x)
print(s, "len:", len(s))
print("pop:", s.pop())
print("peek:", s.peek())
not loaded

Plantillas de patrones

Memoriza los esqueletos; el problema solo rellena la condición.

Ventana deslizante

l = 0
for r in range(len(arr)):
    # expand window with r
    # shrink from the left when the condition fails
    if condition:
        l += 1

Patrón de pila

stack = []
for ch in s:
    if stack and ch == stack[-1]:
        stack.pop()
    else:
        stack.append(ch)

Conceptos básicos de POO

class Player:
    def __init__(self, name):
        self.name = name
        self.score = 0

    def add(self, points):
        self.score += points

Chuleta de patrones de EDA

| Patrón | Cuándo recurrir a él | | --- | --- | | Dos punteros | Arreglos ordenados, par desde los extremos | | Ventana deslizante | Subarreglo con una suma / condición | | Sumas de prefijos | Consultas de suma por rango | | Tabla hash (dict) | Contar frecuencias, buscar el complemento | | Pila | Paréntesis válidos, pila monótona |

Si ves X, piensa en Y

Funciones integradas que debes memorizar

len, type, range, enumerate, sorted, sum, min, max

Sistema de práctica

Diario de errores

Usa este formato cada vez que te atasques; la meta es extraer una regla reutilizable de cada error:

Ejemplo de causa raíz: usé b = a en lugar de a.copy().

Seguimiento de LeetCode (muestra)

| # | Problema | Tema | Estado | Idea clave | Error | Reintento | | - | ------- | ----- | ------ | -------- | ------- | ----- | | 1 | Two Sum | dict | | búsqueda del complemento | | | | 2 | Valid Palindrome | strings | | normalizar + dos punteros | | | | 3 | Contains Duplicate | set | | comparar la longitud del conjunto | | | | 4 | Valid Anagram | dict | | conteos de frecuencia | | | | 5 | Running Sum | lists | | total acumulado de prefijos | | |

Verificación rápida

Mini ejercicios

Buenas y malas prácticas

Errores comunes

Conclusiones clave