第一版
class Solution {
public int myAtoi(String str) {
boolean numFlag = false;
boolean nagetive = false;
int length = str.length();
int result = 0;
for (int i = 0; i < length; i++) {
if (!numFlag) {
if (Character.isDigit(str.charAt(i))) {
result += str.charAt(i) - '0';
numFlag = true;
} else if (str.charAt(i) == '+') {
numFlag = true;
} else if (str.charAt(i) == '-') {
nagetive = true;
numFlag = true;
} else if (str.charAt(i) == ' ') {
continue;
} else {
return 0;
}
} else {
if (Character.isDigit(str.charAt(i))) {
if (nagetive && (-result < Integer.MIN_VALUE / 10 || result == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 8)) {
return Integer.MIN_VALUE;
}
if (!nagetive && (result > Integer.MAX_VALUE / 10 || result == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' >= 7)) {
return Integer.MAX_VALUE;
}
result *= 10;
result += str.charAt(i) - '0';
System.out.println(result);
} else {
break;
}
}
}
if (nagetive) {
return -result;
}
return result;
}
}
考虑到字符串的前部分可能连续出现空格,于是用循环来处理,并设置标志在第一次出现有效字符时进行逻辑的转换。
但是可以利用str.trim()函数直接去除字符串前后端的空格,于是前半部分的循环逻辑得到简化。
第二版
class Solution {
public int myAtoi(String str) {
str = str.trim();
if (str.equals(""))
return 0;
boolean nagetive = false;
int length = str.length();
int result = 0;
if (Character.isDigit(str.charAt(0))) {
result += str.charAt(0) - '0';
} else if (str.charAt(0) == '+') {
} else if (str.charAt(0) == '-') {
nagetive = true;
} else if (str.charAt(0) == ' ') {
} else {
return 0;
}
for (int i = 1; i < length; i++) {
if (Character.isDigit(str.charAt(i))) {
if (nagetive && (-result < Integer.MIN_VALUE / 10 || result == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 8)) {
return Integer.MIN_VALUE;
}
if (!nagetive && (result > Integer.MAX_VALUE / 10 || result == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' >= 7)) {
return Integer.MAX_VALUE;
}
result *= 10;
result += str.charAt(i) - '0';
} else {
break;
}
}
if (nagetive) {
return -result;
}
return result;
}
}