方1:k神的题解有限状态自动机
初始状态,接受状态
? |------>被接受
初始状态-------转移规制------->接受状态----------|------>被拒绝
本题根据题意9种状态
0、开始的空格 1、幂符号前的正负号 2、小数点前的数字 3、小数点、小数点后的数字 4、当小数点前为空格时,小数点、小数点后的数字 5、幂符号 6、幂符号后的正负号 7、幂符号后的数字 8、结尾的空格
绘制状态转移图
根据状态转移图抽象成状态转移表,字符串根据状态转移表遍历,最后结果属于 2,3,7,8则字串合法
class Solution {
public boolean isNumber(String s) {
Map[] states = {
new HashMap<>() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }},
new HashMap<>() {{ put('d', 2); put('.', 4); }},
new HashMap<>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }},
new HashMap<>() {{ put('d', 3); put('e', 5); put(' ', 8); }},
new HashMap<>() {{ put('d', 3); }},
new HashMap<>() {{ put('s', 6); put('d', 7); }},
new HashMap<>() {{ put('d', 7); }},
new HashMap<>() {{ put('d', 7); put(' ', 8); }},
new HashMap<>() {{ put(' ', 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;
}
}
作者:jyd
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/mian-shi-ti-20-biao-shi-shu-zhi-de-zi-fu-chuan-y-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方二:剑指书上的解法
class Solution {
int left,right;
public boolean isNumber(String s) {
char[] c = s.toCharArray();
right = c.length-1;
while(left<=right && c[left] == ' ') left++;
while(left<=right && c[right] == ' ') right--;
if(left<=right && (c[left] == '+' || c[left] == '-')) left++;
boolean res = isNumber(c);
if(left<=right && c[left] == '.'){
left++;
res = isNumber(c) || res;
}
if(left<=right && (c[left] == 'e' || c[left] == 'E')){
left++;
if(left<=right && (c[left] == '+' || c[left] == '-')) left++;
res = res && isNumber(c);
}
return res && left == right+1;
}
public boolean isNumber(char[] c){
int tmp = left;
while(left<=right && c[left]>='0' && c[left]<='9') left++;
return left>tmp;
}
}
越界判断
x是当前位
res>bndry | 执行拼接10×res≥2147483650越界 |
---|
res=bndry,x>7 | 拼接后是2147483648或2147483649越界 |
class Solution {
public int strToInt(String str) {
char[] c = str.trim().toCharArray();
if(c.length==0) return 0;
int res=0,bndry = Integer.MAX_VALUE/10;
int i=1,flag=1;
if(c[0]=='-') flag=-1;
else if(c[0]!='+') i=0;
for(int j=i;j<c.length;j++){
if(c[j]<'0' || c[j]>'9') break;
if(res>bndry || (res==bndry && c[j]>'7'))
return flag==1? Integer.MAX_VALUE:Integer.MIN_VALUE;
res = res*10+(c[j]-'0');
}
return res*flag;
}
}
|