leetCode有一些看上去简单,其实让人头疼的题,比如有限状态机DFA
DFA(deterministic finite automaton )有限状态机
状态机表示若干个状态以及在这些状态之间的转移和动作等行为的数学模型。
通俗的描述状态机就是定义了一套状态変更的流程:状态机包含一个状态集合,
定义当状态机处于某一个状态的时候它所能接收的事件以及可执行的行为,执行完成后,状态机所处的状态。
DFA是一个含5个元素的元祖(S, q0, T, F, Σ)
S:状态的集合
q0:初始化状态
T:过渡方式?(transition function,此处翻译的不大准确)
F:结束状态的集合
Σ:全部的字母表
比如说图G1就是一个DFA图,那么
S:{0,1,2}
q0:{0}
T:此处可以列个表
state/letter | a | b |
---|---|---|
0 | 1 | 0 |
1 | 2 | 0 |
2 | 2 | 2 |
F:{2}
Σ:{a,b}
上面其实不重要=。=,直接看题吧,看似很简单,实际好麻烦。来看LeetCode题
LeetCode很少题有5个示例的,状态之多,越写越懵==
简单分析一下,要干的事其实不难,把一个字符串转换成int类型的整数,首先要找到一个非空的字符,如果第一个非空的字符不是数字"0~9" 和'+','-',返回0;如果第一个字符是数字(包含+','-'),后面出现非数字截止。。
纸上分析一下问题的状态图(实际上是盗官方的图):
- 都有哪几种状态
有start,end两个状态,还有两个中间态sign(判断符号),in_number(数字) - 确定自动机中需要考虑的数据分类
答:数据有4类:数字,正负符号,空格和其他 - 确定自动机中数据的状态
答:自动机最后返回的结果为数字*正负符号,若是遇到其他则返回0,空格不影响结果。 - 确定自动机的开始和结束
答:当遇到数字,或者正负符号的时候,自动机开始。
当数字溢出,或者遇到其他,或者得到最后的结果,自动机结束。 - 确定自动机开始后的流程
- 遇到数字,[自动机开始],进行计算,[溢出返回或计算结束返回,自动机结束]
- 遇到正负符号,[自动机开始],符号保留
- 遇到不是数字,不是空格的,直接返回0
- [自动机开始]的状态下,遇到非数字,[自动机结束]
嗯,流程已经比较清晰了,代码就是把分析好的流程翻译一下
class Solution {
public int myAtoi(String str) {
boolean flag = true;// 符号位
Long result = 0L;//数值结果,因为要判断int最大值,long方便一点
boolean begin = false;
char[] charArray = str.toCharArray();
for (char c : charArray) {
if (c >= '0' && c <= '9') {
result = result * 10 + c - '0';
if (flag && result >= Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (!flag && -result <= Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
begin = true;
} else {
if (!begin && c == '-') {
flag = false;
begin = true;
continue;
}
if (!begin && c == '+') {
flag = true;
begin = true;
continue;
}
if (begin && (c < '0' || c > '9')) {
break;
}
if (!begin && c != ' ') {
return 0;
}
}
}
return flag ? Integer.parseInt(result.toString()) : -Integer.parseInt(result.toString());
}
}
边界值还是很烦。。