제목 : 정수 문자열 변환
당신이 기능을 구현하기 위해 atoi 함수, 그것은 문자열을 정수로 변환 할 수 있습니다.
에 첫째, 기능을 기반으로합니다 폐기 쓸모없는 공백 문자로 시작해야하는 지금까지 최초의 비 공백 문자로 찾을 때까지. 다음과 같이 다음 변환 규칙은 다음과 같습니다 :
- 첫 번째 문자가 null 이외의 양수 또는 음수 인 경우, 많은 연속적인 숫자가 조합으로와 뒷면의 부호는 부호있는 정수를 형성한다.
- 최초의 비 공백 문자가 연속 숫자가 정수를 형성하기 위해 결합 후 바로 숫자 인 경우.
- 문자열은 또한 유효 추가 문자의 정수 부분 이후에있을 수 있습니다, 이러한 문자가 무시 될 수있다, 그들은 기능에 영향을 미치지 않습니다.
참고 : 유효한 정수 문자열이 비어 있거나 공백 문자열을 포함하는 최초의 비 공백 문자가 문자열이 아닌 경우하면 함수가 변환이 효과적 일 수 없습니다 변환 할 필요가 없습니다.
함수가 효율적으로 변환 할 수없는 경우 어떤 경우에는, 0이 반환됩니다.
팁 :
이 질문에 공백 문자 ''오직 공백 문자를 포함한다.
우리는 환경, 그 수치 범위를 32 비트 정수 크기를 저장할 수 있다고 가정 [-2 (31)는 2 (31)은 - 1] (2의 값이이 범위를 초과하는 경우, 반환 INT_MAX 31이다 . - 1) 또는 INT_MIN (-2 31이다 ).
예 1 :
입력 : "42"
출력 : 42
예 2 :
입력 : "-42"
출력 : -42
설명 : 첫 번째 공백이 아닌 문자는 '-'는 부정적인 표지판입니다.
우리는 모든 디지털 연속 마이너스 번호와 나중에 최대한 결합, 그리고 마지막으로 -42을 얻을 것이다.
예 3 :
입력 : "4193 단어"
출력 : 4193
설명 : 다음 문자가 숫자가 아니기 때문에, 디지털 OFF '3'으로 변환.
예 4 :
입력 : "단어와 987"
출력 : 0
설명 : 'W'첫 번째 공백이 아닌 문자하지만 양수 또는 음수가 아닙니다.
따라서, 변환을 효과적으로 수행 할 수 없다.
예 5 :
입력 : "-91283472332"
출력 : -2147483648
설명 : 숫자 "-91283472332"32 비트 부호있는 정수의 범위.
따라서 INT_MIN를 반환 (-2 31이다 ).
질문은 매우 분명 우리가 문자열을 정수로 변환 할 수 있었다.
어려움은 플라스틱 범위를 초과한다는 것이다.
우리는 대략 도로이 문제를 해결하려면 다음과 같은 단계로 나누어 :
- 쓸모없는 공간 생략
- 판사 기호
- 디지털 처리
숫자를 다루는, 우리는 범위를 벗어나는 정수 정수 여부를 결정해야합니다 :
- ANS * 10 + V> INT_MAX
그러나 왼쪽에 표현하고, * 10 + V는 우리가 적절한 변형을 할 수 있도록 가능성, 정수 범위보다 클 수도 있습니다 :
- ANS> (INT_MAX - V) / 10
따라서, 성형의 범위를 벗어나지 않고 결정될 수있다.
코드 (C ++) :
클래스 해결 { 공개 : INT myAtoi ( 문자열 STR) { INT I = 0 , = 기호 1. ; INT ANS = 0 ; // 공간을 이동 그동안을 (STR [I] == ' ' ) ++ I 단계; // 처리 된 심볼 IF (STR [I] == ' - ' ) = 로그인 - 1. , IF (STR [I] == ' + ' || STR [I] == ' - ' ) I ++ ; //处理数字 동안 (STR [I]> = ' 0 ' && STR [I]가 <= ' 9 ' ) { INT의 V = STR [I] - ' 0 ' ; 경우 (ANS> (INT_MAX - V) / 10 ) 반환 서명 == 1 ? INT_MAX : INT_MIN; ANS = ANS * 10 + V; 내가 ++ ; } 반환 서명 *의 ANS; } };
2020-04-03-19 : 48 : 59