要求:
- 这个函数需要丢弃之前的空白字符,直到找到第一个非空白字符。之后从这个字符开始,选取一个可选的正号或负号后面跟随尽可能多的数字,并将其解释为数字的值。
- 字符串可以在形成整数的字符后包括多余的字符,将这些字符忽略,这些字符对于函数的行为没有影响。
- 如果字符串中的第一个非空白的字符不是有效的整数,或者没有这样的序列存在,字符串为空或者只包含空白字符则不进行转换。
- 如果不能执行有效的转换,则返回 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; 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的存在,所以,需要分开处理正数和负数的问题