LeetCode第65题:有效数字(困难)
-
题目:验证给定的字符串是否可以解释为十进制数字。我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:数字 0-9、指数 - “e”、正/负号 - “+”/"-"、小数点 - “.” 当然,在输入中,这些字符的上下文也很重要。
-
思路一:暴力解法,逐位考虑字符串。情况很多,容易考虑不全面。一直改了好久,好累呀。。。
class Solution {
public boolean isNumber(String s) {
int len = s.length();
int i = 0;
boolean fuhao = false;
boolean zhishu = false;
boolean xiaoshu = false;
boolean shuzi = false;
boolean fei = false;
while(i<len){
char a = s.charAt(i);
//其他字符
if((a>='A' && a<='Z') || (a>='a' && a<='z' && a!='e')){
return false;
}else if(a==' '){//空格情况
if(i==0 && len==1) return false;//只有空格
while(i<len){
a = s.charAt(i);
if(a==' '){
if(shuzi==false && i==len-1) return false;
i++;
}else{
if(shuzi==true || xiaoshu==true || zhishu==true ||fuhao==true) return false;
break;
}
}
}else if(a<='9' && a>='0'){//数字情况
if(a!='0') fei=true;
shuzi=true;
i++;
}else if(a=='e'){//‘e’情况
if(zhishu) return false;
if(shuzi==false || i==len-1) return false;
zhishu=true;
shuzi=false;
fuhao=false;
xiaoshu =false;
i++;
}else if(a=='.'){//小数点情况
if(shuzi==false && i==len-1) return false;
if(xiaoshu) return false;
if(zhishu) return false;
xiaoshu=true;
i++;
}else if(a=='+' || a=='-'){//正负符号情况
if(i==len-1) return false;
if(shuzi==false && fuhao==false && xiaoshu==false){
fuhao=true;
i++;
}else{
return false;
}
}
}
return true;
}
}
- 思路二:利用了DFA解决,大概明白是什么意思,估计下次遇到还是不会选择这种方法。讨人厌的图灵。。。
class Solution {
public int make(char c) {
switch(c) {
case ' ': return 0;
case '+':
case '-': return 1;
case '.': return 3;
case 'e': return 4;
default:
if(c >= 48 && c <= 57) return 2;
}
return -1;
}
public boolean isNumber(String s) {
int state = 0;
int finals = 0b101101000;
int[][] transfer = new int[][]{{ 0, 1, 6, 2,-1},
{-1,-1, 6, 2,-1},
{-1,-1, 3,-1,-1},
{ 8,-1, 3,-1, 4},
{-1, 7, 5,-1,-1},
{ 8,-1, 5,-1,-1},
{ 8,-1, 6, 3, 4},
{-1,-1, 5,-1,-1},
{ 8,-1,-1,-1,-1}};
char[] ss = s.toCharArray();
for(int i=0; i < ss.length; ++i) {
int id = make(ss[i]);
if (id < 0) return false;
state = transfer[state][id];
if (state < 0) return false;
}
return (finals & (1 << state)) > 0;
}
}
作者:user8973
链接:https://leetcode-cn.com/problems/valid-number/solution/biao-qu-dong-fa-by-user8973/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。