题目:请实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有符号整数。
函数myAtoi(string s)的算法如下:
1.读入字符串并丢弃无用的前导空格
2.检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
3.读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
4.将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
5.如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。
6.返回整数作为最终结果
class Solution{public int myAtoi(String str){Automation automation=new Automation();int length=str.length();for(int i=0;i<length;++i){automation.get(str.charAt(i)); } return(int)(automation.sign*automation.ans);}
}
class Automation{public int sign=1;public long ans=0;private String state="start";private Map<String,String[]>table=new HashMap<String,String[]>(){{put("start",new String[]{"start","signed","in_number","end"});put("signed",new String[]{"end","end","in_number","end"}); put("in_number",new String[]{"end","end","in_number","end"}); put("end",new String[]{"end","end","end","end"}); }}; public void get(char c){state=table.get(state)[get_col(c)];if("in_number".equals(state)){ans=ans*10+c-'0';ans=sign==1?Math.min(ans,(long)Integer.MAX_VALUE):Math.min(ans,-(long)Integer.MIN_VALUE); }else if("signed".equals(state)){sign=c=='+'?1:-1; } }private int get_col(char c){if(c==' '){return 0; } if(c=='+'||c=='-'){return 1; }if(Character.isDigit(c)){return 2; }return 3;}
}