当前位置: 首页> 汽车> 车展 > LeetCode第65题 有效数字 结合设计模式:状态模式

LeetCode第65题 有效数字 结合设计模式:状态模式

时间:2025/7/12 20:14:09来源:https://blog.csdn.net/m0_63246220/article/details/141614979 浏览次数: 0次

思路:有限状态机,结合Java的设计模式:状态模式。


单纯用状态机会有大量的if-else,非常不好看,思路不清晰


用设计模式则非常清楚。但是设计模式是为了给人理解的,对机器而言也可能稍微影响性能;


状态模式的关键:Machine(这里的Machine类就是Solution)持有一个State接口对象,State是一个接口,ConcreteSate是State的子类,并且里面有状态的枚举;并且最关键是接口方法中都要接受一个Machine对象,这样才好改变State
这里只有一个accept方法,还不是很能体现状态模式的优势;如果再多来几个方法,用状态模式的优势就会更加明显。

注意:这样写出来的代码经测试用时2ms,不如直接面向过程的if-else大法。

因为设计模式本身就基本上是面向对象的,相当于为了人能更好理解,做了额外的封装,所以性能会稍微受点影响。

class Solution {State state = ConcreteState.INIT;public boolean isNumber(String s) {int n = s.length();for (int i = 0; i < s.length(); i++) {state.accept(s.charAt(i),this);if(state == ConcreteState.EXCEPTION){return false;}}if(state == ConcreteState.NUM2 || state == ConcreteState.NUM4|| state == ConcreteState.INDEX3){return true;}else{return false;}}
}interface State{void accept(char ch,Solution solution);
}enum ConcreteState implements State {/**用状态机来做0-初始状态:可以接正负号或数字,接到一个正负号或数字或小数点如果接收到正负号,转为数字模式1;如果接收到数字,转为数字模式2;如果接收到小数点,转为数字模式31-数字模式1:可以接受数字、小数点如果接收到数字,转为数字模式2;如果接收到小数点,转为数字模式32-数字模式2:可以接受数字、小数点、或e/E、或结束如果接收到数字,不变;如果接收到小数点,转为模式4,如果接收到e/E,转为指数模式;也可在此处结束3-数字模式3:必须接受数字,接收数字后转为数字模式44-数字模式4:可以接受数字、e/E、或结束如果接收数字,不变;如果接收e/E,转为指数模式;也可在此结束5-指数模式:能接受正负号或数字。如果接收正负号,转为指数模式2如果接收数字,转为指数模式36-指数模式2:只能接受数字接受后转为指数模式37-指数模式3:能接收数字、或在此结束8-异常状态*/INIT{@Overridepublic void accept(char ch,Solution solution) {if (ch == '+' || ch == '-' ){solution.state = NUM1;}else if(ch >= '0' && ch <= '9'){solution.state = NUM2;}else if(ch == '.'){solution.state = NUM3;}else{solution.state = EXCEPTION;}}},NUM1{@Overridepublic void accept(char ch, Solution solution) {if (ch >= '0' && ch <= '9'){solution.state = NUM2;}else if(ch == '.'){solution.state = NUM3;}else{solution.state = EXCEPTION;}}},NUM2{@Overridepublic void accept(char ch, Solution solution) {if (ch >= '0' && ch <= '9'){solution.state = NUM2;}else if(ch == '.'){solution.state = NUM4;}else if(ch == 'e' || ch == 'E'){solution.state = INDEX;}else{solution.state = EXCEPTION;}}},NUM3{@Overridepublic void accept(char ch, Solution solution) {if(ch >= '0' && ch <= '9'){solution.state = NUM4;}else{solution.state = EXCEPTION;}}},NUM4{@Overridepublic void accept(char ch, Solution solution) {if(ch >= '0' && ch <= '9'){solution.state = NUM4;}else if(ch == 'e' || ch == 'E'){solution.state = INDEX;}else{solution.state = EXCEPTION;}}},INDEX{@Overridepublic void accept(char ch, Solution solution) {if(ch >= '0' && ch <= '9'){solution.state = INDEX3;}else if(ch == '+' || ch == '-'){solution.state = INDEX2;}else{solution.state = EXCEPTION;}}},INDEX2{@Overridepublic void accept(char ch, Solution solution) {if(ch >= '0' && ch <= '9'){solution.state = INDEX3;}else{solution.state = EXCEPTION;}}},INDEX3{@Overridepublic void accept(char ch, Solution solution) {if(ch >= '0' && ch <= '9'){solution.state = INDEX3;}else{solution.state = EXCEPTION;}}},EXCEPTION{@Overridepublic void accept(char ch,Solution solution) {}}
}

关键字:LeetCode第65题 有效数字 结合设计模式:状态模式

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: