注意一些状态的判断就可以。不过感觉代码太长了,不够简洁= =!
public int myAtoi(String s) {
int length = s.length();
if (length == 0) {
return 0;
}
int left = 0;
int right = 0;
boolean pos = true;
boolean posFlag = false;
boolean skip0 = true;
boolean scanNumber = false;
for (int i = 0; i < length; i++) {
if ((s.charAt(i) == ' ' || s.charAt(i) == '+') && left == right) {
if (posFlag || scanNumber) {
return 0;
}
left++;
right++;
if (s.charAt(i) == '+') {
posFlag = true;
}
continue;
}
if (s.charAt(i) == '-' && left == right) {
if (posFlag || scanNumber) {
return 0;
}
left++;
right++;
pos = false;
if (s.charAt(i) == '-') {
posFlag = true;
}
continue;
}
if ((int)s.charAt(i) < 48 || (int)s.charAt(i) > 57) {
if (left == right) {
return 0;
} else {
break;
}
} else {
scanNumber = true;
if (skip0 && s.charAt(i) == '0') {
left++;
right++;
} else {
skip0 = false;
right++;
}
}
}
if (right > length || left >= right) {
return 0;
}
if (right - left > 10) {
return pos ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
long number = Long.valueOf(s.substring(left, right));
if (!pos) {
number = - number;
}
if (number < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
if (number > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
return (int)number;
}
【优化】
上一题提到了减少s.length()方法调用的次数问题,这次也一样尝试去掉long number = Long.valueOf(s.substring(left, right)),改为直接计算。
int length = s.length();
if (length == 0) {
return 0;
}
int left = 0;
int right = 0;
boolean pos = true;
boolean posFlag = false;
boolean skip0 = true;
boolean scanNumber = false;
long resultNum = 0;
for (int i = 0; i < length; i++) {
if ((s.charAt(i) == '-' || s.charAt(i) == ' ' || s.charAt(i) == '+') && left == right) {
if (posFlag || scanNumber) {
return 0;
}
left++;
right++;
if (s.charAt(i) == '+') {
posFlag = true;
}
if (s.charAt(i) == '-') {
posFlag = true;
pos = false;
}
continue;
}
if ((int)s.charAt(i) < 48 || (int)s.charAt(i) > 57) {
if (left == right) {
return 0;
} else {
break;
}
} else {
scanNumber = true;
if (skip0 && s.charAt(i) == '0') {
left++;
right++;
} else {
skip0 = false;
right++;
resultNum = resultNum * 10 + (s.charAt(i) - '0');
}
}
}
if (right > length || left >= right) {
return 0;
}
if (right - left > 10) {
return pos ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
if (!pos) {
resultNum = - resultNum;
}
if (resultNum <= Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
if (resultNum >= Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
return (int)resultNum;
其实我这个逻辑还是比较长,在计算数字的时候,可以精确一下溢出的逻辑,计算数字的时候溢出就结束循环,应该还能更快。