《LeetCode》 문제풀이 노트:008.String to Integer(atoi)[E] - 플러스 마이너스 처리

5875 단어 LeetCodeatoi

008. String to Integer (atoi) [E]

  • String to Integer atoi E
  • 제목
  • 사고방식
  • 코드

  • 제목.


    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.

    사고의 방향


    이 문제도 비교적 잘 풀린다. 관건은 매우 많은 것을 고려해야 한다는 것이다. 나도 여러 번 제출한 후에야 이렇게 많은 고려해야 할 부분이 있다는 것을 발견했다.
  • 시작 공백
  • 양과 음 기호의 처리
  • 오버플로우 처리
  • 불법 입력
  • 시작 스페이스 바 처리:
    while(str[i] == " ") i++;
    

    플러스 마이너스 처리: 저는 Yuroofei라는 해결 방안이 정말 훌륭하다고 생각합니다.
    if (str[i] == '-' || str[i] == '+') {
          sign = 1 - 2 * (str[i++] == '-'); 
     }
     ……
     return base * sign;
    

    오버플로우 처리(이전 문제 참조):
    if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > INT_MAX%10)) {
                if (sign == 1) return INT_MAX;
                else return INT_MIN;
            }
    

    불법 입력: 사실 필터만 하면 돼요.
     while (str[i] >= '0' && str[i] <= '9') {
     ……
     }
    

    코드


    제 코드는 간결하지 않습니다. Yuruofeifei의 코드를 참고할 수 있습니다. 아래에 있습니다.
    class Solution {
    public:
        int myAtoi(string str) {
            long tmp=0;
            bool neg;
            int i = 0;
            while(str[i] == ' ') i++; //    
            neg = str[i] == '-'?1:0;
            for(i = i+ (neg || str[i] == '+');i < str.length();i++)  //   -   + i+1    
            {
                if(str[i] - '0' >= 0 && str[i] - '0' < 10)   //      
                {
                   tmp *= 10;
                   tmp += (str[i] - '0'); 
                   if(tmp >= INT_MAX && !neg)    //    
                   {
                       tmp =  INT_MAX;
                       break;
                   }
                   if(tmp -1  >= INT_MAX && neg)  //    ,INT_MAX INT_MIN  1
                   {
                       tmp = INT_MIN;
                       break;
                   }
                }
                else break;
            }
            if(neg) return -tmp;
            return tmp;
        }
    };

    yuroofeifei 코드
    int myAtoi(string str) {
        int sign = 1, base = 0, i = 0;
        while (str[i] == ' ') { i++; }
        if (str[i] == '-' || str[i] == '+') {
            sign = 1 - 2 * (str[i++] == '-'); 
        }
        while (str[i] >= '0' && str[i] <= '9') {
            if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
                if (sign == 1) return INT_MAX;
                else return INT_MIN;
            }
            base  = 10 * base + (str[i++] - '0');
        }
        return base * sign;
    }

    좋은 웹페이지 즐겨찾기