LeetCode 8: String to Integer (atoi)
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
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.
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.