LeetCode(剑指 Offer)- 20. 表示数值的字符串
Posted 程序员牧码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 20. 表示数值的字符串相关的知识,希望对你有一定的参考价值。
题目链接:点击打开链接
题目大意:略。
解题思路:解决方案(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;
以上是关于LeetCode(剑指 Offer)- 20. 表示数值的字符串的主要内容,如果未能解决你的问题,请参考以下文章