自动机原理

题目 一道可以揭示自动机原理的算法题
其实自动机并不神秘,TCP的状态转换也是自动机。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

package com.example.brushalgorithmproblem;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Duan Xiangqing
 * @version 1.0
 * @date 2021/9/22 12:57 上午
 */
//字符串转换整数 (atoi)
public class lt8 {
    //自动机  不同的状态对不同的输入进行不同的处理
    public static int myAtoi(String s) {
        //创建自动机实例
        AutoMachine autoMachine = new AutoMachine();
        //根据状态对每个字符进行运算
        for (int i = 0; i < s.length(); i++) {
            autoMachine.get(s.charAt(i));
        }
        //返回结果
        return (int) (autoMachine.sigh * autoMachine.ans);
    }

    static class AutoMachine {
        public int sigh;
        public long ans;
        private String state;
        //状态转换表
        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 AutoMachine() {
            //初始化
            sigh = 1;
            ans = 0;
            state = "start";
        }

        public void get(char c) {
            //转换到下一个状态
            state = table.get(state)[get_col(c)];
            //在状态中进行计算
            if ("in_number".equals(state)) {
                ans = ans * 10 + c - '0';
                //处理极值边界 Integer.MAX_VALUE与Integer.MIN_VALUE的数字部分是不相同的
                ans = sigh == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);
            } else if ("signed".equals(state)) {
                sigh = 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;
        }
    }

    //传统方法
    public static int myAtoi1(String s) {
        //去除左边的空格
        char[] chs = s.trim().toCharArray();
        if (chs.length == 0) {
            return 0;
        }
        int res = 0, bndry = Integer.MAX_VALUE / 10;
        int i = 1, sign = 1;
        if (chs[0] == '-') {
            sign = -1;
        } else if (chs[0] != '+') {
            //巧妙
            i = 0;
        }
        for (int j = i; j < chs.length; j++) {
            if (chs[j] < '0' || chs[j] > '9') {
                break;
            }
            //处理极值
            if (res > bndry || res == bndry && chs[j] > '7') {
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            res = res * 10 + chs[j] - '0';
        }
        return sign * res;
    }

    public static void main(String[] args) {
        String s = "42";
        String s1 = "   -42";
        String s2 = "4193 with words";
        String s3 = "words and 987";
        String s4 = "-91283472332";

        System.out.println(myAtoi(s));
        System.out.println(myAtoi(s1));
        System.out.println(myAtoi(s2));
        System.out.println(myAtoi(s3));
        System.out.println(myAtoi(s4));
        System.out.println();
        System.out.println(myAtoi1(s));
        System.out.println(myAtoi1(s1));
        System.out.println(myAtoi1(s2));
        System.out.println(myAtoi1(s3));
        System.out.println(myAtoi1(s4));
    }
}

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值