题目链接:点击打开链接
题目大意:略。
解题思路:解决方案(1) 状态转移表,看懂算我输。
相关企业
- 字节跳动
AC 代码
// 解决方案(1) class Solution { public boolean isNumber(String s) { Map[] states = { new HashMap<>() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }}, // 0. new HashMap<>() {{ put('d', 2); put('.', 4); }}, // 1. new HashMap<>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, // 2. new HashMap<>() {{ put('d', 3); put('e', 5); put(' ', 8); }}, // 3. new HashMap<>() {{ put('d', 3); }}, // 4. new HashMap<>() {{ put('s', 6); put('d', 7); }}, // 5. new HashMap<>() {{ put('d', 7); }}, // 6. new HashMap<>() {{ put('d', 7); put(' ', 8); }}, // 7. new HashMap<>() {{ put(' ', 8); }} // 8. }; int p = 0; char t; for(char c : s.toCharArray()) { if(c >= '0' && c <= '9') t = 'd'; else if(c == '+' || c == '-') t = 's'; else if(c == 'e' || c == 'E') t = 'e'; else if(c == '.' || c == ' ') t = c; else t = '?'; if(!states[p].containsKey(t)) return false; p = (int)states[p].get(t); } return p == 2 || p == 3 || p == 7 || p == 8; } } // 解决方案(2) class Solution { public boolean isNumber(String s) { s = s.trim().toLowerCase(); if (s.length() == 0) { return false; } String[] split = s.split("e"); if (split.length > 2) { return false; } else if (split.length == 2 && s.charAt(s.length() - 1) != 'e') { return isOkay(split[0]) && isInteger(split[1]); } else if (split.length == 1) { return isOkay(s); } return false; } private boolean isOkay(String s) { return isInteger(s) || isDecimal(s); } private boolean isInteger(String s) { if (s.length() == 0) { return false; } char[] chars = s.toCharArray(); // 先解决第一个, 省得后面 for 一直要判断 "+"、"-" char c = chars[0]; if (c >= 'a' && c <= 'z' || c == ' ' || c == '.') { return false; } else if ((c == '+' || c == '-') && s.length() == 1) { return false; } for (int i = 1; i < chars.length; i++) { c = chars[i]; if (c >= 'a' && c <= 'z' || c == ' ' || c == '.' || c == '+' || c == '-') { return false; } } return true; } private boolean isDecimal(String s) { if (s.length() == 0) { return false; } char[] chars = s.toCharArray(); boolean dot = true; // 先解决第一个, 省得后面 for 一直要判断 "+"、"-"、"." char c = chars[0]; if (c >= 'a' && c <= 'z' || c == ' ') { return false; } else if ((c == '+' || c == '-') && s.length() == 1) { return false; } else if ((c == '+' || c == '-') && chars[1] == '.' && s.length() == 2) { return false; } else if (c == '.') { if (s.length() == 1) { return false; } dot = false; } for (int i = 1; i < chars.length; i++) { c = chars[i]; if (c == '.') { if (dot) { dot = false; } else { return false; } } else if (c >= 'a' && c <= 'z' || c == ' ' || c == '+' || c == '-') { return false; } } return true; } } // 解决方案(3) class Solution { public boolean isNumber(String s) { try { char c = Character.toLowerCase(s.charAt(s.length() - 1)); if ('f' == c || 'd' == c) { return false; } Double.valueOf(s); return true; } catch (NumberFormatException e) { return false; } } }