String to Integer (atoi)
LeetCode 8. String to Integer (atoi)
원문
Implement the myAtoi(string s)
function, which converts a string to a 32-bit signed integer (similar to C/C++’s atoi
function.).
The algorithm for myAtoi(string s)
is as follows:
- Read in and ignore any leading whitespace.
- Check if the next character (if not already at the end of the string) is
'-'
or'+'
. Read this character in if it is either. This determines if the final result if negative or positive respectively. Assume the result is positive if neither is present. - Read in next the characters until the next non-digit character or the end of the input is reached. The rest of the string is ignored.
- Convert these digits into an integer (i.e.
"123" -> 123
,"0032" -> 32
). If no digits were read, then the integer is0
. Change the sign as necessary (from step 2). - If the integer is out of the 32-bit signed integer range
[-231, 231-1
, then clamp the integer so that it ramains in the range.
Specifically, integers less than-231
should be clamped to-231
, and integers greater than231-1
should be clamped to231-1
. - Return the integer as the final result.
Note:
- Only the space character
' '
is considered a whitespace character. - Do not ignore any characters other than the leading whitespace or the rest of the string after the digits.
풀이
- 음수 여부, 시작 여부, 값을 나타내기 위한 변수
negative
,start
,result
를 선언한다. 이때negative
와start
의 초기값은False
,result
의 초기값은0
이다. - 주어진 문자열
s
를 순회한다.start
가False
일 때' '
은 넘어간다.+
가 나오면start
를True
로 바꿔준다.-
가 나오면start
와negative
를True
로 바꿔준다.- 숫자가 나오면
result
에 숫자를 더해주고start
를True
로 바꿔준다. - 그 외의 경우 반복문에서 나온다.
start
가True
일 때- 숫자가 나오면
result
에 10을 곱한 값에 숫자를 더해준다. - 그 외의 경우 반복문에서 나온다.
- 숫자가 나오면
negative
가True
라면result
의 값을231
과result
중 작은 값으로 정하고-1
을 곱해준다.negative
가False
라면result
의 값을231-1
과result
중 작은 값으로 정한다.result
를 반환한다.
Python에서는 오버플로우가 일어나지 않아 위와 같은 풀이로도 풀리지만 그렇지 않은 경우 아래의 방식으로 해결할 수 있다.
- 문자열을 순회하는 도중
start
가True
인 경우- 숫자가 나왔을 때
result
의 값이 부호가 있는 32비트 정수의 최대값에서 해당 숫자를 뺀 값을 10으로 나눈 것보다 크면negative
가True
: 부호가 있는 32비트 정수의 최소값 반환negative
가False
: 부호가 있는 32비트 정수의 최대값 반환
- 크지 않다면 기존의 방식처럼
result
에 10을 곱하고 숫자를 더한다.
- 숫자가 나왔을 때
코드
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution:
def myAtoi(self, s: str) -> int:
negative = False
start = False
result = 0
for letter in s:
if not start:
if letter == ' ':
continue
elif letter == '+':
start = True
elif letter == '-':
negative = True
start = True
elif letter.isdigit():
result += int(letter)
start = True
else:
break
else:
if letter.isdigit():
result = result * 10 + int(letter)
else:
break
if negative:
result = min(2 ** 31, result)
result *= -1
else:
result = min(2 ** 31 - 1, result)
return result
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
public int myAtoi(String s) {
boolean negative = false;
boolean start = false;
int result = 0;
for (int i = 0; i < s.length(); i++) {
if (!start) {
if (s.charAt(i) == ' ') {
continue;
} else if (s.charAt(i) == '+') {
start = true;
} else if (s.charAt(i) == '-') {
negative = true;
start = true;
} else if (Character.isDigit(s.charAt(i))) {
result = s.charAt(i) - '0';
start = true;
} else {
break;
}
} else {
if (Character.isDigit(s.charAt(i))) {
int num = s.charAt(i) - '0';
if (result > (Integer.MAX_VALUE - num) / 10) {
if (negative) {
return Integer.MIN_VALUE;
} else {
return Integer.MAX_VALUE;
}
}
result = result * 10 + num;
} else {
break;
}
}
}
if (negative) {
return result * -1;
}
return result;
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.