8. 字符串转换整数 (atoi)

在这里插入图片描述

初始方法,写出所有边界条件,扩展性不强,容易漏

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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值