Leetcode 문제 해결 방법 -8. 문자열 변환 정수 (atoi)

주제 링크

제목 설명:

atoi함수 를 구현하러 오세요 . 문자열을 정수로 변환 할 수 있습니다.

첫째,이 함수는 공백이 아닌 첫 번째 문자를 찾을 때까지 필요에 따라 쓸모없는 시작 공백 문자를 버립니다. 다음과 같은 변환 규칙은 다음과 같습니다.

공백이 아닌 첫 번째 문자가 양수 또는 음수 부호 인 경우이 부호를 가능한 한 많은 연속 디지털 문자와 결합하여 부호있는 정수를 형성하십시오.
공백이 아닌 첫 번째 문자가 숫자 인 경우 다음 연속 숫자 문자와 직접 결합되어 정수를 형성합니다.
문자열에는 유효한 정수 부분 뒤에 추가 문자가있을 수도 있으므로 이러한 문자는 무시할 수 있으며 함수에 영향을주지 않아야합니다.
참고 : 문자열에서 공백이 아닌 첫 번째 문자가 유효한 정수 문자가 아니거나 문자열이 비어 있거나 문자열에 공백 문자 만 포함 된 경우 함수를 변환 할 필요가 없습니다. 즉, 효과적으로 변환 할 수 없습니다.

어쨌든 함수가 유효한 변환을 수행 할 수 없으면 0을 반환하십시오.

신속한:

이 질문의 공백 문자에는 공백 문자 만 포함됩니다 ' '.
우리 환경이 32 비트 부호있는 정수만 저장할 수 있다고 가정하면 값 범위는 [−2 ^ 31, 2 ^ 31 − 1]입니다. 값이이 범위를 초과하면 INT_MAX (2 ^ 31-1) 또는 INT_MIN (-2 ^ 31)을 반환하십시오.

예 1 :

입력 : "42"
출력 : 42

예 2 :

입력 : "-42"
출력 : -42
설명 : 공백이 아닌 첫 번째 문자는 음수 부호 인 '-'입니다.
마이너스 기호를 모든 후속 숫자와 결합하기 위해 최선을 다하고 마지막으로 -42를 얻습니다.

예 3 :

입력 : "4193 with words"
출력 : 4193
설명 : 다음 문자가 숫자가 아니기 때문에 변환이 숫자 '3'에서 끝납니다.

예 4 :

입력 : "words and 987"
출력 : 0
설명 : 공백이 아닌 첫 번째 문자는 'w'이지만 숫자 나 양수 또는 음수 부호가 아닙니다.
따라서 효과적인 변환을 수행 할 수 없습니다.

예 5 :

입력 : "-91283472332"
출력 : -2147483648
설명 : 숫자 "-91283472332"가 부호있는 32 비트 정수 범위를 초과합니다.
따라서 INT_MIN (−2 ^ 31)이 반환됩니다.


신중한 시뮬레이션

  이 질문에는 많은 상황이 고려되며 유일한 요구 사항은 인내심입니다. 과정은 다음과 같습니다.

  1. 공백이 아닌 첫 번째 문자가 나타날 때까지 문자열 시작 부분의 공백을 제거하십시오.
  2. 비어 있지 않은 첫 번째 문자가 숫자인지 기호 0인지 판단하고 그렇지 않은 경우를 반환 하고 그렇다면 계속해서 기호인지 판단합니다.
  3. flag식별자를 더하기 또는 빼기 기호로 설정하면 끝입니다 result * flag.
  4. 다음 단계는 공백, 기호 또는 문자 (숫자 제외)를 만날 때까지 계속 판단하는 것입니다.
  5. result = result * 10 + num루프에서 문자열을 숫자로 변환합니다.
  6. 아웃 외에 대해 잊지 마세요 경계 상황, 당신은 INT_MAX할 수 가 축적 된 이후에 매번보다 큰지 여부를 판단 , flag다음은이 있는지 여부를 확인하기 위해 유용 INT_MAX또는이다 INT_MIN;

암호

class Solution {
    
    
public:
    int myAtoi(string str) {
    
    
        int indexNum = 0;
        int len = str.size();
        while(indexNum < len && str[indexNum] == ' ')
            indexNum++;
        
        if(indexNum == len || (str[indexNum] > 'A' && str[indexNum] <= 'z'))
            return 0;
        
        long long result = 0;
        int flag = 1;

        if(str[indexNum] == '-'){
    
    
            flag = -1;
            indexNum++;
        }
        else if(str[indexNum] == '+')
            indexNum++;
        
        while(indexNum < len && str[indexNum] >= '0' && str[indexNum] <= '9'){
    
    
            int num = str[indexNum] - '0';
            result = result * 10 + num;
            indexNum++;
            if(result > INT_MAX){
    
    
                return (flag == -1) ?  INT_MIN : INT_MAX;
            }
        }

        return result * flag;
    }
};


실수가 있거나 엄격하지 않은 경우 저를 바로 잡으십시오. 대단히 감사합니다.
내 블로그 : http://breadhunter.gitee.io

추천

출처blog.csdn.net/weixin_40807714/article/details/105289559