LeetCode 8: String to Integer (atoi)

Nov 13 2020

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

3 Marc Nov 13 2020 at 10:21

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.

1 Reinderien Nov 13 2020 at 22:22

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.