思路
需要一个sign变量指示值的正负,初始化为1。首先对str进行trim操作,去除两头的空格,然后再进行正负号的判断,之后进入循环,计算字符串的值:先对上一次的结果*10,再加上当前取出来的数字。循环:首先碰到不是0~9字符的就直接结束;循环中可以进行剪枝,计算出当前sum值后,与INT_MAX和INT_MIN进行比较,如果超出范围则直接break。【注意sum需要是long类型的,防止溢出】
代码
class Solution {
public int myAtoi(String str) {
int sign = 1;int index = 0;str = str.trim();if(str.length() == 0)return 0;if(str.charAt(index) == '+') {
index++;} else if(str.charAt(index) == '-') {
sign = -1;index++;}long sum = 0;for(; index < str.length(); index++) {
if(str.charAt(index) < '0' || str.charAt(index) > '9')break;int cur = str.charAt(index) - '0';sum *= 10;sum += cur;if(sum > Integer.MAX_VALUE)break;}sum *= sign;if(sum > Integer.MAX_VALUE)return Integer.MAX_VALUE;if(sum < Integer.MIN_VALUE)return Integer.MIN_VALUE;return (int)sum;}
}
复杂度
时间复杂度O(n), 空间复杂度O(1)