반응형

[LeetCode, 리트코드] String to Integer (atoi)

반응형


1. Problem


문자열을 정수로 바꿔주는 atoi 함수를 구현하라.  이 함수는 첫 번째 공백이 아닌 문자가 나타날 때까지 최대한 많은 공백문자들을 버린다. 다음 그 문자열부터 시작해서 선택적 옵션인 더하기와 빼기 사인을 받고 그 다음 숫자를 나타내는 문자들을 최대한 받는다. 최종적으로 그것을 숫자로 변환한다. 정수를 나타내는 문자열 뒤에 추가적인 문자열을 가질 수 있다. 하지만 이것들은 무시되어야하고 이 함수는 이 문자열들에 대해 아무 영향이 없어야 한다. 만약 str에 있는 첫 번째 공백문자들이 아닌 열들이  유효한 정수로 표현되지 않거나 이런 문자열들이 존재하지 않을 때는 (str이 비어있거나 공백문자만 있을 경우) 아무 변환도 하지 않는다. 아무 변환도 하지 않을 시, 0을 반환한다.


2. Solution


체크해야 될 사항만 제대로 빠뜨리지 않고 처리하면 큰 문제 없이 통과할 수 있다. 다만 그것을 깔끔하기 처리하기가 까다로운 편. 처리해야될 사항은 아래와 같다.


1. +/- 사인

2. 실제값 계산

3. 숫자가 아닌 문자열 무시 하지만 만일 숫자가 아닌 문자열이 앞에 올 시 0을 반환해야함

4. 공백처리

5. 오버플로우처리



3. What I solved

class Solution {
public:
    int myAtoi(string str) {
        str = trim(str);
        if(str.size() == 0)
            return 0;
        
        char sign = '+';
        int i=0;
        if(str[0] == '-'){
            sign = '-';
            i++;
        }
        else if(str[0] == '+'){
            i++;
        }
        
        double ret = 0;
        while(str.size() > i && str[i] >= '0' && str[i] <= '9'){
            ret = ret*10 + (str[i] - '0');
            i++;
        }
        
        if(sign == '-')
            ret = -ret;
        
        if(ret >= numeric_limits::max())
            return numeric_limits::max();
        else if (ret <= numeric_limits::min())
            return numeric_limits::min();
            
        return (int)ret;
    }
    
    inline string& ltrim(string& s, const char* t = " \t\n\r\f\v"){
        s.erase(0, s.find_first_not_of(t));
        return s;
    }
    
    inline string& rtrim(string& s, const char* t = " \t\n\r\f\v"){
        s.erase(s.find_last_not_of(t) + 1);
        return s;
    }
    
    inline string& trim(string& s, const char* t = " \t\n\r\f\v"){
        return ltrim(rtrim(s, t), t);
    }
};


4. Best Solution


위와 동일

반응형

이 글을 공유하기

댓글

Designed by JB FACTORY