LeetCode 8: String para Inteiro (atoi)
Estou postando uma solução para "String to Integer (atoi)" do LeetCode. Se você gostaria de revisar, por favor faça. Obrigado!
Problema
Implemente atoi que converte uma string em um inteiro. A função primeiro descarta quantos caracteres de espaço em branco forem necessários até que o primeiro caractere diferente de espaço em branco seja encontrado. Em seguida, começar a partir desse caractere pega um sinal de mais ou menos inicial opcional seguido por tantos dígitos numéricos quanto possível e os interpreta como um valor numérico. A string pode conter caracteres adicionais após aqueles que formam o número integral, que são ignorados e não têm efeito no comportamento desta função. Se a primeira sequência de caracteres sem espaço em branco em str não for um número inteiro válido, ou se nenhuma sequência existir porque str está vazio ou contém apenas caracteres de espaço em branco, nenhuma conversão é executada. Se nenhuma conversão válida puder ser realizada, um valor zero será retornado.
Nota:
Apenas o caractere de espaço '' é considerado um caractere de espaço em branco. Suponha que estamos lidando com um ambiente que só pode armazenar inteiros dentro do intervalo de inteiros com sinal de 32 bits: [−231, 231 - 1]. Se o valor numérico estiver fora da faixa de valores representáveis, 231 - 1 ou −231 é retornado.
Exemplo 1:
Input: str = "42"
Output: 42
Exemplo 2:
Input: str = " -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign. Then take as many numerical digits as possible, which gets 42.
Exemplo 3:
Input: str = "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.
Exemplo 4:
Input: str = "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical digit or a +/- sign. Therefore no valid conversion could be performed.
Exemplo 5:
Input: str = "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer. Thefore INT_MIN (−231) is returned.
Código
from typing import List
import collections
import itertools
import functools
import math
import string
import random
import bisect
import re
import operator
import heapq
import queue
from queue import PriorityQueue
from itertools import combinations, permutations
from functools import lru_cache
from collections import defaultdict
from collections import OrderedDict
from collections import deque
from collections import Counter
class Solution:
def myAtoi(self, s):
s = re.findall(r'^\s*[+-]?\d+', s)
try:
MAX, MIN = 2147483647, -2147483648
res = int(''.join(s))
if res > MAX:
return MAX
if res < MIN:
return MIN
return res
except:
return 0
if __name__ == "__main__":
print(Solution().myAtoi(" -42"))
Referências:
LeetCode 8. String para Inteiro (atoi)
Leetcode atoi (string para inteiro)
Respostas
Ótima solução, é compacta e simples de entender. Há pouco a melhorar, algumas sugestões:
- Importações : há muitas importações, talvez sobras de tentativas anteriores.
- Try Except block : deve ser em torno do código que pode causar a exceção.
Aplicando as sugestões:
import re
class Solution:
def myAtoi(self, s: str) -> int:
MAX, MIN = 2147483647, -2147483648
s = re.findall(r'^\s*[+-]?\d+', s)
try:
res = int(''.join(s))
except:
return 0
if res > MAX:
return MAX
if res < MIN:
return MIN
return res
atuação
Runtime: 36 ms, faster than 51.56% of Python3 online submissions
Memory Usage: 14.1 MB, less than 32.27% of Python3 online submissions
Regex torna o código compacto, mas não é a abordagem mais rápida. Soluções mais rápidas iteram pela string caractere por caractere.
Números mágicos
2147483647, -2147483648
são na verdade
1<<31 - 1, -(1<<31)
que transmite melhor sua intenção: os limites de um inteiro de 32 bits com sinal.
Pré-compilar seu regex
Considere colocar um
DIGIT_PATTERN = re.compile(r'^\s*[+-]?\d+')
em escopo global, para que várias chamadas para myAtoisejam mais rápidas.
Nunca nu except
Você provavelmente deveria em vez disso except ValueError, que é mais restrito e bem definido.