String to integer (atoi) en LeetCode: solución en Python


Continuando con la emocionante serie de problemas de LeetCode, toca el turno a la emocionante conversión de cadena a entero al estilo ASCII to Integer como C solía hacerlo. Según Google la función atoi() (ASCII to Integer) pertenece originalmente a la biblioteca estándar de C (stdlib.h) y se utiliza para convertir una cadena de texto en un número entero. Debido a su antigüedad y popularidad, esta función o sus alternativas directas están presentes en múltiples lenguajes:

  • C: El lenguaje de origen. La encuentras usando #include <stdlib.h>.
  • C++: Heredada de C, también está disponible, aunque a partir de C++11 se recomienda usar std::stoi por ser más segura ante errores.
  • PHP: Cuenta con la función nativa intval() o conversión explícita.
  • Java, Python y C#: No tienen atoi directamente como una función global, pero realizan la misma tarea mediante métodos de clase (por ejemplo, Integer.parseInt() en Java o int() en Python.

Y yo con el recuerdo aun bastante fresco del problema "Reverse Integer" anterior, me lancé a escribir:


class Solution:
    def myAtoi(self, s: str) -> int:
        positive = True
        start = True
        result = 0

        for char in s.strip():
            if start and '+' == char:
                start = False
                continue

            if start and '-' == char:
                positive = False
                start = False
                continue

            if not char.isdigit():
                break
            
            result = 10 * result + int(char)
            start = False
        
        llimit = -2**31
        ulimit = 2**31 - 1

        if positive and result > ulimit:
            result = ulimit
        
        if not positive:
            result *= -1

            if result < llimit:
                result = llimit

        return result
Dos observaciones concretas:
  1. start = False se repite en tres ramas distintas — podrías simplificarlo.
  2. El .strip() elimina espacios de ambos lados, pero el problema solo pide ignorar espacios al inicio. En la práctica no rompe los tests porque los inputs válidos no tienen espacios al final seguidos de dígitos, pero es semánticamente incorrecto.
En cuanto al enfoque: es correcto y es el estándar para este problema. Big O: O(n) en tiempo, O(1) en espacio.

Claude parecía realmente decepcionado al tener poco que corregirme. Ya no toqué más el problema. Una cosa curiosa es que LeetCode indicaba que en tiempo mi solución era mejor al 100% de las otras soluciones... me sentí como Quick Silver salvando a los X-Men.

If I could save time in a bottle, the first thing that I'd like to do....

Problema anterior

Comentarios