题目 一道可以揭示自动机原理的算法题
其实自动机并不神秘,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));
}
}