初始方法,写出所有边界条件,扩展性不强,容易漏
class Solution {
public int myAtoi(String s) {
int index = 0, prefix = 1, result = 0;
boolean isZero = false;
while(index < s.length() && s.charAt(index) == ' '){
index++;
}
while(index < s.length() && s.charAt(index) == '0'){
isZero = true;
index++;
}
if(isZero && index < s.length() && !(s.charAt(index) >= '0' && s.charAt(index) <= '9'))
return 0;
if(index < s.length()){
if(s.charAt(index) == '-'){
prefix = -1;
index++;
}else if(s.charAt(index) == '+'){
index++;
}
}
while(index < s.length()){
char c = s.charAt(index++);
if(c >= '0' && c <= '9'){
if(result > Integer.MAX_VALUE / 10
|| (result == Integer.MAX_VALUE / 10 && c - '0' > 7)) return Integer.MAX_VALUE;
if(result < Integer.MIN_VALUE / 10
|| (result == Integer.MIN_VALUE / 10 && c - '0' > 8)) return Integer.MIN_VALUE;
result = result * 10 + (c - '0') * prefix;
}else break;
}
return result;
}
}
改成有限状态机
class Solution {
public int myAtoi(String s) {
Automation a = new Automation();
for(int i = 0; i <= s.length(); i++){
if(i == s.length() || a.ended)
return (int)a.ans;
a.calculate(s.charAt(i));
}
return 0;
}
}
class Automation{
public int sign = 1;
public long ans = 0;
public String currentState = "start";
public boolean ended = false;
private Map<String, String[]> stateTable = new HashMap<>(){{
put("start", new String[]{"start", "sign", "number", "end"});
put("sign", new String[]{"end", "end", "number", "end"});
put("number", new String[]{"end", "end", "number", "end"});
}};
public int getColumn(char c){
if(c == ' ') return 0;
else if(c == '+' || c == '-') return 1;
else if(Character.isDigit(c)) return 2;
else return 3;
}
public void calculate(char c){
currentState = stateTable.get(currentState)[getColumn(c)];
if(currentState.equals("end")){
ended = true;
}else if(currentState.equals("sign")){
sign = c == '-' ? -1 : 1;
}else if(currentState.equals("number")){
ans = ans * 10 + sign * (c - '0');
ans = sign == 1 ? Math.min(ans, Integer.MAX_VALUE) : Math.max(ans, Integer.MIN_VALUE);
}
}
}