这道题虽然我用ifelse 做出来了,但是正儿八经的正统算法还是需要自动机来完成的,
包括电梯问题。
我的代码
public static void main(String[] args) {
String s = " 1 11 ";
System.out.println("===" +s.trim()+ "===");
String ss = "-1E-16";
System.out.println(isNumber(ss));
}
public static boolean isNumber(String s) {
if(s == null || s.length() == 0) return false;
boolean res = process(s.trim().toCharArray());
return res;
}
public static boolean process(char[] chs){
if(chs.length ==0) return false;
if( chs.length ==1 && (chs[0] < '0' || chs[0]>'9') )return false;
int e = -1;
for(int i = 0; i<chs.length; i++){
if(chs[i] =='e' || chs[i] =='E'){
e = i;
break;
}
}
boolean res;
if(e != -1){
res = pointNum(chs, 0, e-1) && eNum(chs, e, chs.length-1);
}else {
res = pointNum(chs, 0, chs.length-1);
}
return res;
}
public static boolean posNum(char[] chs, int i , int j){
if(i==j && (chs[i]<'0' || chs[i] >'9' )) return false;
if(chs[i] != '+' && (chs[i]<'0' || chs[i]>'9')) {
return false;
}
else {
for(int index = i+1; index <=j; index ++){
if(chs[index] > '9' || chs[index]<'0') return false;
}
}
return true;
}
public static boolean negNum(char[] chs, int i, int j){
if(i==j && (chs[i]<'0' || chs[i] >'9' )) return false;
if(chs[i] != '-' && (chs[i]<'0' || chs[i]>'9')) {
return false;
}
else {
for(int index = i+1; index <= j ; index ++){
if(chs[index] > '9' || chs[index]<'0') return false;
}
}
return true;
}
public static boolean pointNum(char[] chs, int i , int j){
if(i==j && (chs[i]<'0' || chs[i] >'9' )) return false;
if(j-i ==1 && chs[j] =='.' && (chs[i]<'0' || chs[i] > '9')) return false;
boolean point = false;
if(chs[i] !='.' && chs[i] !='+' && chs[i]!='-' &&( chs[i]<'0' || chs[i]>'9')){
return false;
}
if(chs[i] == '.'){
point = true;
}
for(int index =i+1; index<=j; index++){
if(!point && chs[index] != '.' && ( chs[index] <'0' || chs[index]> '9')){
return false;
}else if(point && chs[index] =='.'){
return false;
}else if(!point && chs[index] == '.') {
point = true;
}else if( chs[index] <'0' || chs[index]> '9'){
return false;
}
}
return true;
}
/**i 表示 e首次出现的位置*/
public static boolean eNum(char[] chs, int i, int j){
boolean hasE = false;
if(i +1 == chs.length) return false;
return posNum(chs,i+1,j) || negNum(chs, i+1, j );
}
官方题解:
class Solution {
public boolean isNumber(String s) {
Map<State, Map<CharType, State>> transfer = new HashMap<State, Map<CharType, State>>();
Map<CharType, State> initialMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_SPACE, State.STATE_INITIAL);
put(CharType.CHAR_NUMBER, State.STATE_INTEGER);
put(CharType.CHAR_POINT, State.STATE_POINT_WITHOUT_INT);
put(CharType.CHAR_SIGN, State.STATE_INT_SIGN);
}};
transfer.put(State.STATE_INITIAL, initialMap);
Map<CharType, State> intSignMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_INTEGER);
put(CharType.CHAR_POINT, State.STATE_POINT_WITHOUT_INT);
}};
transfer.put(State.STATE_INT_SIGN, intSignMap);
Map<CharType, State> integerMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_INTEGER);
put(CharType.CHAR_EXP, State.STATE_EXP);
put(CharType.CHAR_POINT, State.STATE_POINT);
put(CharType.CHAR_SPACE, State.STATE_END);
}};
transfer.put(State.STATE_INTEGER, integerMap);
Map<CharType, State> pointMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_FRACTION);
put(CharType.CHAR_EXP, State.STATE_EXP);
put(CharType.CHAR_SPACE, State.STATE_END);
}};
transfer.put(State.STATE_POINT, pointMap);
Map<CharType, State> pointWithoutIntMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_FRACTION);
}};
transfer.put(State.STATE_POINT_WITHOUT_INT, pointWithoutIntMap);
Map<CharType, State> fractionMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_FRACTION);
put(CharType.CHAR_EXP, State.STATE_EXP);
put(CharType.CHAR_SPACE, State.STATE_END);
}};
transfer.put(State.STATE_FRACTION, fractionMap);
Map<CharType, State> expMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_EXP_NUMBER);
put(CharType.CHAR_SIGN, State.STATE_EXP_SIGN);
}};
transfer.put(State.STATE_EXP, expMap);
Map<CharType, State> expSignMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_EXP_NUMBER);
}};
transfer.put(State.STATE_EXP_SIGN, expSignMap);
Map<CharType, State> expNumberMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_NUMBER, State.STATE_EXP_NUMBER);
put(CharType.CHAR_SPACE, State.STATE_END);
}};
transfer.put(State.STATE_EXP_NUMBER, expNumberMap);
Map<CharType, State> endMap = new HashMap<CharType, State>() {{
put(CharType.CHAR_SPACE, State.STATE_END);
}};
transfer.put(State.STATE_END, endMap);
int length = s.length();
State state = State.STATE_INITIAL;
for (int i = 0; i < length; i++) {
CharType type = toCharType(s.charAt(i));
if (!transfer.get(state).containsKey(type)) {
return false;
} else {
state = transfer.get(state).get(type);
}
}
return state == State.STATE_INTEGER || state == State.STATE_POINT || state == State.STATE_FRACTION || state == State.STATE_EXP_NUMBER || state == State.STATE_END;
}
public CharType toCharType(char ch) {
if (ch >= '0' && ch <= '9') {
return CharType.CHAR_NUMBER;
} else if (ch == 'e' || ch == 'E') {
return CharType.CHAR_EXP;
} else if (ch == '.') {
return CharType.CHAR_POINT;
} else if (ch == '+' || ch == '-') {
return CharType.CHAR_SIGN;
} else if (ch == ' ') {
return CharType.CHAR_SPACE;
} else {
return CharType.CHAR_ILLEGAL;
}
}
enum State {
STATE_INITIAL,
STATE_INT_SIGN,
STATE_INTEGER,
STATE_POINT,
STATE_POINT_WITHOUT_INT,
STATE_FRACTION,
STATE_EXP,
STATE_EXP_SIGN,
STATE_EXP_NUMBER,
STATE_END
}
enum CharType {
CHAR_NUMBER,
CHAR_EXP,
CHAR_POINT,
CHAR_SIGN,
CHAR_SPACE,
CHAR_ILLEGAL
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/biao-shi-shu-zhi-de-zi-fu-chuan-by-leetcode-soluti/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。