LeetCode 8: String to Integer (atoi)
Saya memposting solusi untuk LeetCode's "String to Integer (atoi)". Jika Anda ingin mengulas, harap lakukan. Terima kasih!
Masalah
Menerapkan atoi yang mengubah string menjadi integer. Fungsi pertama membuang karakter spasi putih sebanyak yang diperlukan hingga karakter non-spasi pertama ditemukan. Kemudian, memulai dari karakter ini mengambil tanda plus atau minus opsional diikuti dengan sebanyak mungkin digit numerik, dan menafsirkannya sebagai nilai numerik. String dapat berisi karakter tambahan setelah yang membentuk bilangan integral, yang diabaikan dan tidak berpengaruh pada perilaku fungsi ini. Jika urutan pertama karakter non spasi dalam str bukan bilangan integral yang valid, atau jika tidak ada urutan seperti itu karena str kosong atau hanya berisi karakter spasi, tidak ada konversi yang dilakukan. Jika tidak ada konversi valid yang dapat dilakukan, nilai nol dikembalikan.
catatan:
Hanya karakter spasi '' yang dianggap sebagai karakter spasi putih. Asumsikan kita berurusan dengan lingkungan yang hanya dapat menyimpan bilangan bulat dalam kisaran bilangan bulat bertanda 32-bit: [−231, 231 - 1]. Jika nilai numerik berada di luar kisaran nilai yang dapat direpresentasikan, 231-1 atau −231 dikembalikan.
Contoh 1:
Input: str = "42"
Output: 42
Contoh 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.
Contoh 3:
Input: str = "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.
Contoh 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.
Contoh 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.
Kode
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"))
Referensi:
LeetCode 8. String ke Integer (atoi)
Leetcode atoi (string ke integer)
Jawaban
Solusi bagus, ringkas dan mudah dipahami. Ada sedikit yang perlu ditingkatkan, sedikit saran:
- Impor : ada banyak impor, mungkin sisa dari upaya sebelumnya.
- Coba blok kecuali : harus berada di sekitar kode yang dapat menyebabkan pengecualian.
Menerapkan saran:
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
Performa
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 membuat kodenya kompak tetapi bukan pendekatan tercepat. Solusi yang lebih cepat melakukan iterasi melalui karakter string demi karakter.
Angka ajaib
2147483647, -2147483648
sebenarnya
1<<31 - 1, -(1<<31)
yang menyampaikan maksud Anda dengan lebih baik: batas integer 32-bit bertanda.
Pra-kompilasi regex Anda
Pertimbangkan untuk meletakkan file
DIGIT_PATTERN = re.compile(r'^\s*[+-]?\d+')
dalam lingkup global, sehingga beberapa panggilan menjadi myAtoilebih cepat.
Tidak pernah telanjang except
Anda sebaiknya memilih except ValueError, yang lebih sempit dan terdefinisi dengan baik.