思路
本题看似简单,实现起来比较困难,有许多细节需要注意:
- 字符串前面的空格处理
- 去除前面的空格后,当前第一个字符正负号的处理
- 去除空格后,需要重新判断当前字符串的长度是否为0
- 当首字符中间有非数字是,要跳出循环返回符号乘以结果
- 要先判断结果是否超出界限Interger.MAX或Interger.MIN,再更新res的值,否则当输入值为max-1时会输出错误的值max;
具体步骤
- 通过字符串库函数trim()去除首尾空格
- 判断去除空格的字符串长度是否为0(否则当字符为""时会报错)
- 去除首尾空格的字符串通过库函数转换为字符数组
- 一个符号变量sign,一个索引变量index记录非符号字符 - + 的开始索引,判断首字符是 - + 非字符 的处理
- 首字符判断完后,通过index依次此判断每个字符,数字就更新res的值,非数字字符返回sign*res
- 循环结束后返回sign*res
代码
class Solution {
public int myAtoi(String str) {
if(str == null || str.length()==0)
return 0;
str = str.trim(); //去除首尾空格
if(str.length() == 0)return 0; //再次判断去除空格的字符长度
char[] chars = str.toCharArray();
int sign = 1,index = 0,res = 0;
if(chars[0] == '-'){
sign = -1;
index++;
}
else if(chars[0] == '+'){
index++;
}
//else if(!Character.isDigit(chars[0])){ //这一步可以不要,后面循环中有判断
// return 0;
//}
for(int i = index;i < str.length();i++)
{
if(!Character.isDigit(chars[i]))//当中间有不是数字字符时,结束循环并返回结果
return sign*res;
else{
if(sign == 1 && res > (Integer.MAX_VALUE-(chars[i]-'0'))/10 ) return Integer.MAX_VALUE;
if(sign == -1 && res > (Integer.MAX_VALUE-(chars[i]-'0'))/10) return Integer.MIN_VALUE;
res = res*10 + chars[i]-'0'; //放在后面,先判断上一次的结果是否大于最大值除以10,若比res小,则说明结果就是最大值
}
}
return sign*res;
}
}
复杂度
时间复杂度:O(N),一层循环
空间复杂度:O(1),没有额外开辟空间