题目
咳咳,各位大佬好,小白献丑了。
代码思路是比较简单易懂,因为小白解题是暴力暴力暴力的,按题意一路写。
首先说明一下变量,result是得到的数值结果;flag是用来控制result的正负的;couFuHao是只收取前导空格之后的+/-,而数值中的+/-是数值终止的情况之一;ZF是解决数值中夹有+/-的情况,如"00000-42a1234",如错误案例一,只统计-之前的数;KG是只过滤前导空格,夹在数值中的空格是数值终止的情况之一,是不能过滤的,如错误案例二三。
代码写法有点像switch case结构,思路标明在代码中。
代码实现:
class Solution {
public int myAtoi(String s) {
int result = 0,flag = 1;
boolean couFuHao = false,ZF = false,KG = false;
for(int i = 0;i < s.length();i++){
if(s.charAt(i) == ' ' && !KG) continue;//过滤掉前导空格
if(s.charAt(i) == '+' && !couFuHao && !ZF){//此if和下面的if是获取该数的正负情况
KG = true;
couFuHao = true;
continue;
}
if(s.charAt(i) == '-' && !couFuHao && !ZF){
KG = true;
flag = -1;
couFuHao = true;
continue;
}
if(s.charAt(i) <'0' || s.charAt(i) > '9'){//这是获取数值统计终止符,注意前几个if结构中的continue的作用,不会使此处错误的获取终止符
break;
}
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
KG = true;//此两个变量见变量说明
ZF=true;
if (flag == 1 && (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && (s.charAt(i) - '0') >Integer.MAX_VALUE % 10))) {//注意result在每次变化之前,都需要判断result是否超过边界
return Integer.MAX_VALUE;
}
if (flag == -1 && (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && (s.charAt(i) - '0') > -(Integer.MIN_VALUE % 10)))) {
return Integer.MIN_VALUE;
}
result = result*10+flag*Integer.parseInt(String.valueOf(s.charAt(i)));//flag在此作用
}
}
return result;
}
}
错误案例:
结果: