LeetCode 8: String to Integer (atoi)

Nov 13 2020

Ich poste eine Lösung für LeetCodes "String to Integer (atoi)". Wenn Sie eine Bewertung abgeben möchten, tun Sie dies bitte. Vielen Dank!

Problem

Implementieren Sie atoi, das eine Zeichenfolge in eine Ganzzahl konvertiert. Die Funktion verwirft zunächst so viele Leerzeichen wie nötig, bis das erste Nicht-Leerzeichen gefunden wird. Ausgehend von diesem Zeichen wird dann ein optionales Plus- oder Minuszeichen gefolgt von möglichst vielen numerischen Ziffern verwendet und als numerischer Wert interpretiert. Die Zeichenfolge kann nach denen, die die Integralzahl bilden, zusätzliche Zeichen enthalten, die ignoriert werden und keinen Einfluss auf das Verhalten dieser Funktion haben. Wenn die erste Folge von Nicht-Leerzeichen in str keine gültige ganzzahlige Zahl ist oder wenn keine solche Folge vorhanden ist, weil entweder str leer ist oder nur Leerzeichen enthält, wird keine Konvertierung durchgeführt. Wenn keine gültige Konvertierung durchgeführt werden konnte, wird ein Nullwert zurückgegeben.

Hinweis:

Nur das Leerzeichen '' wird als Leerzeichen betrachtet. Angenommen, es handelt sich um eine Umgebung, in der nur Ganzzahlen innerhalb des 32-Bit-Ganzzahlbereichs mit Vorzeichen gespeichert werden können: [−231, 231 - 1]. Wenn der numerische Wert außerhalb des Bereichs der darstellbaren Werte liegt, wird 231-1 oder -231 zurückgegeben.

Beispiel 1:

Input: str = "42"
Output: 42

Beispiel 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.

Beispiel 3:

Input: str = "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.

Beispiel 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.

Beispiel 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.

Code

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"))

Verweise:

  • LeetCode 8. String to Integer (atoi)

  • Leetcode atoi (Zeichenfolge zu Ganzzahl)

Antworten

3 Marc Nov 13 2020 at 10:21

Gute Lösung, kompakt und einfach zu verstehen. Es gibt wenig zu verbessern, wenige Vorschläge:

  • Importe : Es gibt viele Importe, möglicherweise Reste früherer Versuche.
  • Try Except-Block : Sollte sich um den Code befinden, der die Ausnahme verursachen kann.

Vorschläge anwenden:

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

Performance

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 macht den Code kompakt, ist aber nicht der schnellste Ansatz. Schnellere Lösungen durchlaufen die Zeichenfolge Zeichen für Zeichen.

1 Reinderien Nov 13 2020 at 22:22

Magische Zahlen

2147483647, -2147483648

sind eigentlich

1<<31 - 1, -(1<<31)

was Ihre Absicht besser vermittelt: die Grenzen einer vorzeichenbehafteten 32-Bit-Ganzzahl.

Kompilieren Sie Ihren regulären Ausdruck vor

Erwägen Sie, eine

DIGIT_PATTERN = re.compile(r'^\s*[+-]?\d+')

im globalen Bereich, so dass mehrere Anrufe myAtoischneller sind.

Niemals entblößen except

Sie sollten stattdessen wahrscheinlich except ValueError, was enger und klarer definiert ist.