LeetCode 문제 풀이 -- 8. String to Integer (atoi)

Leetcode 제목:https://leetcode.com/problems/string-to-integer-atoi/
Github 문제 풀이:https://github.com/gatieme/LeetCode/tree/master/008-StringToInteger
CSDN 문제 풀이:http://blog.csdn.net/gatieme/article/details/51046065
제목.
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
Update (2015-02-10): The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.
문자열 이 표시 하 는 숫자 를 정수 형식 으로 변환 합 니 다.
분석 하 다.
간단 한 문 제 는 다음 과 같은 코드 가 주요 프레임 워 크 입 니 다.
for (; *str != '\0'; str++)
{

    if ('0' <= *str && *str <= '9')
    {
        value *= 10;
        value += *str - '0';
#ifdef DEBUG
        printf("value = %lld
"
, value); #endif } else { break; } }

하지만 주의해 야 할 문제 는
  • 앞의 공백 문자
  • //        
    while (*str == ' '  || *str == '
    '
    || *str == '\t') // { str++; }
  • 숫자 앞 에 기호 비트 + / -
  • 가 있 을 수 있 습 니 다.
    //      + -
    if (*str == '+')
    {
        str++;
    }
    else if (*str == '-')
    {
        str++;
        minus = true;
    }
  • overflow 문제
  • 나의 해결 방안 은 순환 하 는 과정 에서 넘 치면 끝난다.
    //   OVER_FLOW   
    // INT_MAX 2147483647
    // INT_MIN -2147483648 minus = true
    if((minus == true  && value > (unsigned long)(INT_MAX) + 1)     //         INT_MAX + 1
     || (minus == false && value > INT_MAX))                         //       INT_MAX
    {
        debug <<value <<", " <<INT_MAX + 1 <<endl;
        debug <<"to max than int" <<endl;
        break;
     }

    만약 에 마지막 으로 발생 할 수 있 는 문 제 를 판단 한다 면 우리 value 가 무엇으로 저장 하 든 롱, 롱 롱 은 모두 표시 범위 가 있 고 넘 침 이 존재 하기 때문에 문자열 이 너무 길 면 넘 침 이 있 고 넘 침 후에 절단 이 발생 하거나 심지어 마이너스 로 읽 을 수 있 기 때문에 우 리 는 순환 이 끝 난 후에 판단 할 수 없다.
    코드
    /************************************************************************* > File Name: atoi.c > Author: GatieMe > Mail: [email protected] > Created Time: 2016 04 02      22 22 06  ************************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <limits.h>
    
    
    #define __tmain main
    
    int myAtoi(const char *str)
    {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
    
        if (str == NULL)
        {
            return 0;
        }
    
        //        
        while (*str == ' '  || *str == '
    '
    || *str == '\t') // { str++; } bool minus = false; // + - if (*str == '+') { str++; } else if (*str == '-') { str++; minus = true; } long long int value = 0; for (; *str != '\0'; str++) { if ('0' <= *str && *str <= '9') { value *= 10; value += *str - '0'; #ifdef DEBUG printf("value = %lld
    "
    , value); #endif } else { break; } // OVER_FLOW // INT_MAX 2147483647 // INT_MIN -2147483648 minus = true if((minus == true && value > (unsigned long)(INT_MAX) + 1) // INT_MAX + 1 || (minus == false && value > INT_MAX)) // INT_MAX { break; } } if (minus == true) { value = -value; } if (value > INT_MAX) { value = INT_MAX; } else if (value < INT_MIN) { value = INT_MIN; } return (int)value; } int __tmain(void) { printf("%d", myAtoi("9223372036854775809")); return EXIT_SUCCESS; }

    좋은 웹페이지 즐겨찾기