LeetCode 8: String to Integer (atoi)

Nov 13 2020

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

3 Marc Nov 13 2020 at 10:21

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.

1 Reinderien Nov 13 2020 at 22:22

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.