LeetCode 8 : 문자열을 정수로 (atoi)
LeetCode의 "String to Integer (atoi)"에 대한 솔루션을 게시하고 있습니다. 리뷰를 원하시면 해주세요. 감사합니다!
문제
문자열을 정수로 변환하는 atoi를 구현하십시오. 이 함수는 먼저 공백이 아닌 첫 번째 문자를 찾을 때까지 필요한만큼 공백 문자를 버립니다. 그런 다음이 문자에서 시작하여 선택적 초기 더하기 또는 빼기 기호와 가능한 한 많은 숫자를 가져 와서 숫자 값으로 해석합니다. 문자열은 정수를 구성하는 문자 뒤에 추가 문자를 포함 할 수 있으며 무시되며이 함수의 동작에 영향을주지 않습니다. str에서 공백이 아닌 문자의 첫 번째 시퀀스가 유효한 정수가 아니거나 str이 비어 있거나 공백 문자 만 포함되어있어 그러한 시퀀스가 존재하지 않는 경우 변환이 수행되지 않습니다. 유효한 변환을 수행 할 수없는 경우 0 값이 반환됩니다.
노트 :
공백 문자 ''만 공백 문자로 간주됩니다. 32 비트 부호있는 정수 범위 ([−231, 231 − 1]) 내에서만 정수를 저장할 수있는 환경을 다루고 있다고 가정합니다. 숫자 값이 표현 가능한 값의 범위를 벗어나면 231 − 1 또는 −231이 반환됩니다.
예 1 :
Input: str = "42"
Output: 42
예 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.
예 3 :
Input: str = "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.
예 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.
예 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.
암호
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"))
참조 :
LeetCode 8. 문자열을 정수로 (atoi)
Leetcode atoi (문자열에서 정수로)
답변
좋은 솔루션, 간단하고 이해하기 쉽습니다. 개선 할 사항이 거의 없으며 몇 가지 제안 사항이 있습니다.
- 수입품 : 수입품 이 많으며 이전 시도의 남은 부분 일 수 있습니다.
- Try Except block : 예외를 일으킬 수있는 코드 주변에 있어야합니다.
제안 적용 :
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
공연
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는 코드를 압축하지만 가장 빠른 방법은 아닙니다. 더 빠른 솔루션은 문자열을 문자 단위로 반복합니다.
매직 넘버
2147483647, -2147483648
실제로
1<<31 - 1, -(1<<31)
의도를 더 잘 전달합니다 : 부호있는 32 비트 정수의 한계.
정규식 사전 컴파일
넣어 고려
DIGIT_PATTERN = re.compile(r'^\s*[+-]?\d+')
여러 호출 myAtoi이 더 빨라지 도록 전역 범위에서 .
맨손으로 except
대신 except ValueError더 좁고 잘 정의 된 이어야합니다 .