解题思路(简单粗暴好理解的解法):
1.遍历字符串,找到第一个非空格的字符,如果没找到,就返回0
2.如果找到的第一个非空字符为正或者负号,则要考虑符号位后一位是否是数字(通过flag判断),不是数字则返回0
3.如果符号位后一位是数字,就要将接下来的连续数字转化为整数,为了防止累加的过程中越界,这里做了两个处理:一是将累加结果res定义成long,二是边加边判断当前结果是否超范围
4.如果找到的第一个非空字符为数字,同样执行累加的过程,具体过程与第3步类似
5.如果找到的第一个非空字符不是数字,直接返回0
代码实现:
class Solution {
public int myAtoi(String str) {
//1.寻找到第一个非空格的字符
//2.当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来
//3.忽略字符串除了有效的整数部分之外的多余的字符
//4.若函数不能进行有效的转换时,返回 0
int len=str.length();
int i=0;
long res=0;
while(i<len){
//1.寻找到第一个非空格的字符
while(i<len&&str.charAt(i)==' '){
i++;
}
if(i==len){//没找到第一个非空格的字符
return 0;
}
//2.找到的第一个非空字符为正或者负号
char first=str.charAt(i);
boolean flag=false;//符号位后有数字
if(first=='+'||first=='-'){
i++;
while(i<len&&str.charAt(i)>='0'&&
str.charAt(i)<='9'){//数字
flag=true;
int temp=str.charAt(i)-'0';
res=res*10+temp;
if(res>Integer.MAX_VALUE&&first=='+'){
return Integer.MAX_VALUE;
}
else if(res>Integer.MAX_VALUE&&first=='-'){
return Integer.MIN_VALUE;
}
i++;
}
if(flag){
res=(first=='-'?(-res):res);
}
break;
}
//3.找到的第一个非空字符为数字
else if(first>='0'&&first<='9'){
while(i<len&&str.charAt(i)>='0'&&
str.charAt(i)<='9'){//数字
int temp=str.charAt(i)-'0';
res=res*10+temp;
if(res>Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}
i++;
}
break;
}
//4.找到的第一个非空字符不是数字
else{
return 0;
}
}
return (int)res;
}
}