LeetCode 8: String to Integer (atoi)
Sto postando una soluzione per "String to Integer (atoi)" di LeetCode. Se desideri rivedere, fallo. Grazie!
Problema
Implementa atoi che converte una stringa in un numero intero. La funzione prima scarta tutti i caratteri di spazio necessari fino a quando non viene trovato il primo carattere diverso da spazi. Quindi, a partire da questo carattere prende un segno più o meno iniziale opzionale seguito da quante più cifre numeriche possibile e le interpreta come un valore numerico. La stringa può contenere caratteri aggiuntivi dopo quelli che formano il numero intero, che vengono ignorati e non hanno alcun effetto sul comportamento di questa funzione. Se la prima sequenza di caratteri non di spaziatura in str non è un numero intero valido, o se non esiste tale sequenza perché str è vuota o contiene solo caratteri di spaziatura, non viene eseguita alcuna conversione. Se non è stato possibile eseguire una conversione valida, viene restituito un valore zero.
Nota:
Solo il carattere spazio "" è considerato un carattere spazio vuoto. Supponiamo di avere a che fare con un ambiente che può memorizzare solo interi entro l'intervallo di interi con segno a 32 bit: [−231, 231 - 1]. Se il valore numerico non rientra nell'intervallo dei valori rappresentabili, viene restituito 231 - 1 o −231.
Esempio 1:
Input: str = "42"
Output: 42
Esempio 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.
Esempio 3:
Input: str = "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.
Esempio 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.
Esempio 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.
Codice
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"))
Riferimenti:
LeetCode 8. Da stringa a Integer (atoi)
Leetcode atoi (da stringa a intero)
Risposte
Bella soluzione, è compatta e semplice da capire. C'è poco da migliorare, pochi suggerimenti:
- Import : ci sono molte importazioni, forse avanzi di tentativi precedenti.
- Prova ad eccezione del blocco : dovrebbe essere intorno al codice che può causare l'eccezione.
Applicare i suggerimenti:
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
Prestazione
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 rende il codice compatto ma non è l'approccio più veloce. Le soluzioni più rapide eseguono l'iterazione della stringa carattere per carattere.
Numeri magici
2147483647, -2147483648
sono in realtà
1<<31 - 1, -(1<<31)
che trasmette meglio il tuo intento: i limiti di un intero a 32 bit con segno.
Precompila la tua regex
Considera l'idea di inserire un file
DIGIT_PATTERN = re.compile(r'^\s*[+-]?\d+')
in ambito globale, in modo che più chiamate a myAtoisiano più veloci.
Mai nudo except
Dovresti probabilmente invece except ValueError, che è più stretto e ben definito.