要求:

  • 这个函数需要丢弃之前的空白字符,直到找到第一个非空白字符。之后从这个字符开始,选取一个可选的正号或负号后面跟随尽可能多的数字,并将其解释为数字的值。
  • 字符串可以在形成整数的字符后包括多余的字符,将这些字符忽略,这些字符对于函数的行为没有影响。
  • 如果字符串中的第一个非空白的字符不是有效的整数,或者没有这样的序列存在,字符串为空或者只包含空白字符则不进行转换。
  • 如果不能执行有效的转换,则返回 0。如果正确的值超过的可表示的范围,则返回 INT_MAX(2147483647)或 INT_MIN(-2147483648)。

直接放代码(C++):

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
int myAtoi(string str) {
int current_index = 0;
int base = 1;
// 字符串为空,返回0
if( str.length() == 0 ){
return 0;
}
// 去除前导空格
while (str[current_index] == ' ' && current_index < str.length()) {
current_index ++;
}
// 分析符号
if( str[current_index] == '+' || str[current_index] == '-' ){
base = (str[current_index++] == '-')? -1:1;
}
int sum = 0;
while (current_index < str.length()) {
int current = str[current_index] - '0';
// 异常情况跳出
if( current < 0 || current > 9){
break;
}
// 判断溢出
if ( sum > 0 && ( sum > INT_MAX / 10 || ( sum == INT_MAX /10 && current >= INT_MAX%10 ) ) ){
return INT_MAX;
} else if ( sum < 0 && ( sum < INT_MIN / 10 || ( sum == INT_MIN /10 && current >= (INT_MIN%10) * -1) ) ){
return INT_MIN;
}
sum = sum* 10 + current * base;
current_index ++;
}
return sum;
}

Notes 注意
C++的INT_MAX是2147483647而INT_MIN是-2147483648,最后一位是不一样的,因为有0的存在,所以,需要分开处理正数和负数的问题