문자열을 정수로(atoi)

3089 단어 theabbieleetcodedsa
문자열을 부호 있는 32비트 정수로 변환하는 myAtoi(string s) 함수를 구현합니다(C/C++의 atoi 함수와 유사).
myAtoi(string s)에 대한 알고리즘은 다음과 같습니다.
  • 선행 공백을 읽고 무시합니다.
  • 다음 문자(아직 문자열의 끝에 있지 않은 경우)가 '-' 또는 '+' 인지 확인하십시오. 둘 중 하나인 경우 이 문자를 읽습니다. 이것은 최종 결과가 각각 음수인지 양수인지를 결정합니다. 둘 다 존재하지 않으면 결과가 양성이라고 가정합니다.
  • 숫자가 아닌 다음 문자 또는 입력 끝에 도달할 때까지 다음 문자를 읽습니다. 나머지 문자열은 무시됩니다.
  • 이 숫자를 정수로 변환합니다(예: "123" -> 123 , "0032" -> 32 ). 숫자를 읽지 않은 경우 정수는 0 입니다. 필요에 따라 기호를 변경합니다(2단계에서).
  • 정수가 32비트 부호 있는 정수 범위[-231, 231 - 1]를 벗어나는 경우 범위에 남도록 정수를 고정합니다. 특히 -231 미만의 정수는 -231 로 고정되어야 하고 231 - 1 보다 큰 정수는 231 - 1 로 고정되어야 합니다.
  • 정수를 최종 결과로 반환합니다.

  • 메모:
  • 공백 문자' '만 공백 문자로 간주됩니다.
  • 선행 공백 또는 숫자 뒤의 나머지 문자열 이외의 문자를 무시하지 마십시오.

  • 예 1:

    입력: s = "42"
    출력: 42
    설명: 밑줄이 그어진 문자는 읽은 내용이고 캐럿은 현재 판독기 위치입니다.
    1단계: "42"(선행 공백이 없기 때문에 문자를 읽지 않음)
    ^^
    2단계: "42"('-'도 '+'도 없기 때문에 문자를 읽지 않음)
    ^^
    3단계: "42"("42"를 읽음)
    ^^
    구문 분석된 정수는 42입니다.
    42는 [-231, 231 - 1] 범위에 있으므로 최종 결과는 42입니다.

    예 2:

    입력: s = "-42"
    출력: -42
    설명:
    1단계: "-42"(선행 공백을 읽고 무시함)
    ^^
    2단계: "-42"('-'를 읽어서 결과가 음수여야 함)
    ^^
    3단계: "-42"("42"를 읽음)
    ^^
    구문 분석된 정수는 -42입니다.
    -42는 [-231, 231 - 1] 범위에 있으므로 최종 결과는 -42입니다.

    예 3:

    입력: s = "단어 포함 4193"
    출력: 4193
    설명:
    1단계: "4193 with words"(선행 공백이 없기 때문에 문자를 읽지 않음)
    ^^
    2단계: "4193 with words"('-'도 '+'도 없기 때문에 문자를 읽지 않음)
    ^^
    3단계: "4193 with words"("4193"을 읽음, 다음 문자가 숫자가 아니므로 읽기가 중지됨)
    ^^
    구문 분석된 정수는 4193입니다.
    4193은 [-231, 231 - 1] 범위에 있으므로 최종 결과는 4193입니다.

    제약:
  • 0 <= s.length <= 200
  • s는 영문자(소문자와 대문자), 숫자(0-9 ), ' ' , '+' , '-' , '.' 로 구성됩니다.

  • 해결책:

    class Solution:
        def clamp(self, val, MIN, MAX):
            if val < MIN:
                return MIN
            if val > MAX:
                return MAX
            return val
    
        def myAtoi(self, s: str) -> int:
            MIN = -1 << 31
            MAX = -MIN - 1
            sign = None
            val = None
            for c in s:
                if c == "+" or c == "-":
                    if val != None:
                        break
                    if sign == None:
                        sign = [-1, 1][c == "+"]
                    else:
                        return 0
                elif 48 <= ord(c) < 58:
                    d = ord(c) - 48
                    val = 10 * (val or 0) + d
                elif val == None and sign == None:
                    if c != " ":
                        return 0
                else:
                    break
            return self.clamp((sign or 1) * (val or 0), MIN, MAX)
    

    좋은 웹페이지 즐겨찾기