LeetCode8:字符串转换整数(字符串)
题目很简单,就是比较麻烦。
思路:
1、去掉前后空格
2、再是处理正负号
3、识别数字,注意越界情况。
这道题目如果只是简单地字符串转整数的话,就是简单地 ret= ret * 10 + digit。
但是注意这道题目可能会超过integer的最大表示!
也就是说会在某一步 ret * 10 + digit > Integer.MAX_VALUE
*10 和 +digit 都有可能越界,那么只要把这些都移到右边去就可以了。
ret > (Integer.MAX_VALUE - digit) / 10 就是越界。
/**
* 字符串转换整数
* @param str
* @return
*/
public int myAtoi(String str) {
//去掉开头结尾的空格
str = str.trim();
if(str.length() <1){
return 0;
}
int startIndex =0;
boolean neg =false;
int ret = 0;
//处理符号问题
if(str.charAt(0) =='-'){
neg =true;
startIndex ++;
}else if(str.charAt(0) == '+'){
startIndex ++;
}else if(!Character.isDigit(str.charAt(startIndex))){
//第一个字符不是数字
return 0;
}
while (startIndex<str.length() && Character.isDigit(str.charAt(startIndex))){
//直到遍历到的字符不是数字
int digit = str.charAt(startIndex) -'0';
if (ret > (Integer.MAX_VALUE - digit) / 10) {
// 本来应该是 ret * 10 + digit > Integer.MAX_VALUE
// 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
return neg? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
ret = ret * 10 + digit;
startIndex ++;
}
return neg?-ret:ret;
}
复杂度分析
时间复杂度:O(N)
空间复杂度:O(1)