लेटकोड 8: स्ट्रिंग टू इंटेगर (अटोई)

Nov 13 2020

मैं LeetCode के लिए एक समाधान पोस्ट कर रहा हूं "स्ट्रिंग टू इंटेगर (अटोई)"। यदि आप समीक्षा करना चाहते हैं, तो कृपया करें। धन्यवाद!

मुसीबत

एटॉय को लागू करें जो एक स्ट्रिंग को पूर्णांक में परिवर्तित करता है। जब तक पहला गैर व्हाट्सएप चरित्र नहीं मिल जाता है, तब तक फ़ंक्शन पहले कई व्हाट्सएप वर्णों को आवश्यक रूप से हटा देता है। फिर, इस चरित्र से शुरू करने के लिए एक वैकल्पिक प्रारंभिक प्लस या माइनस साइन होता है, जिसके बाद संभव के रूप में कई संख्यात्मक अंक होते हैं, और उन्हें संख्यात्मक मान के रूप में व्याख्या करता है। स्ट्रिंग में अतिरिक्त अक्षर शामिल हो सकते हैं जो अभिन्न संख्या बनाते हैं, जिन्हें अनदेखा किया जाता है और इस फ़ंक्शन के व्यवहार पर कोई प्रभाव नहीं पड़ता है। यदि str में गैर-व्हाट्सएप वर्णों का पहला अनुक्रम एक मान्य अभिन्न संख्या नहीं है, या यदि ऐसा कोई अनुक्रम मौजूद नहीं है, क्योंकि या तो str खाली है या इसमें केवल व्हाट्सएप वर्ण हैं, कोई भी रूपांतरण नहीं किया जाता है। यदि कोई मान्य रूपांतरण नहीं किया जा सका, तो एक शून्य मान लौटाया जाता है।

ध्यान दें:

केवल अंतरिक्ष चरित्र '' को एक व्हाट्सएप चरित्र माना जाता है। मान लें कि हम एक ऐसे वातावरण के साथ काम कर रहे हैं जो केवल 32-बिट हस्ताक्षरित पूर्णांक सीमा के भीतर पूर्णांक स्टोर कर सकता है: [with231, 231 - 1]। यदि संख्यात्मक मान प्रतिनिधित्व योग्य मानों की सीमा से बाहर है, तो 231 - 1 या er231 वापस कर दिया जाता है।

उदाहरण 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"))

संदर्भ:

  • लेटकोड 8. स्ट्रिंग टू इंटेगर (अटोई)

  • लेटोडे अटोई (पूर्णांक तक स्ट्रिंग)

जवाब

3 Marc Nov 13 2020 at 10:21

अच्छा समाधान, यह कॉम्पैक्ट और समझने में सरल है। सुधार करने के लिए बहुत कम है, कुछ सुझाव:

  • आयात : बहुत सारे आयात हैं, शायद पिछले प्रयासों के बचे हुए।
  • ब्लॉक को छोड़कर प्रयास करें : उस कोड के आसपास होना चाहिए जो अपवाद का कारण बन सकता है।

सुझाव लागू करना:

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

रेगेक्स कोड को कॉम्पैक्ट बनाता है लेकिन सबसे तेज़ तरीका नहीं है। चरित्र द्वारा स्ट्रिंग चरित्र के माध्यम से तेज़ समाधान पुनरावृति।

1 Reinderien Nov 13 2020 at 22:22

मैजिक नंबर

2147483647, -2147483648

वास्तव में हैं

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

जो आपके इरादे को बेहतर करता है: हस्ताक्षरित 32-बिट पूर्णांक की सीमा।

अपने रेगेक्स को पूर्व-संकलित करें

डालने पर विचार करें

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

वैश्विक दायरे में, ताकि कई कॉल myAtoiतेजी से हो सकें ।

कभी नंगे नहीं except

आपको इसके बजाय संभावना होनी चाहिए except ValueError, जो अधिक संकीर्ण और अच्छी तरह से परिभाषित है।