🌕 剑指 Offer 20. 表示数值的字符串
2022年10月10日
- algorithm
🌕 剑指 Offer 20. 表示数值的字符串
难度: 🌕
问题描述
解法
class Solution {
public boolean isNumber(String s) {
// 思路:
// 根据题意判断条件
String str = s.trim(); // 去掉空格
int len = str.length();
if(len == 0) {
return false;
}
// 判断是否有 e/E,然后分成 2 部分,分别判断
int indexE = str.indexOf('e');
if(indexE == -1) {
indexE = str.indexOf('E');
}
if(indexE == -1) {
// 只需要判断整个字符串
return isInteger(str, 0, len - 1) || isPoint(str, 0, len - 1);
} else {
return (isInteger(str, 0, indexE - 1) || isPoint(str, 0, indexE - 1)) && isInteger(str, indexE + 1, len - 1);
}
}
private boolean isPoint(String str, int left, int right) {
// 递归终止条件
if(left > right) {
return false;
}
if(str.charAt(left) == '-' || str.charAt(left) == '+') {
return isPoint(str, left + 1, right);
}
// 找到 小数点位置
int indexP = -1;
for(int i = left; i <= right; i ++) {
if(str.charAt(i) == '.') {
indexP = i;
break;
}
}
if(indexP == -1) {
return false;
}
if(left == right) {
return false; // 只有一个小数点
}
return isVal(str, left, indexP - 1) && isVal(str, indexP + 1, right);
}
private boolean isVal(String str, int left, int right) {
for(int i = left; i <= right; i ++) {
if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
continue;
} else {
return false;
}
}
return true;
}
private boolean isInteger(String str, int left, int right) {
// 递归终止条件
if(left > right) {
return false;
}
if(str.charAt(left) == '-' || str.charAt(left) == '+') {
return isInteger(str, left + 1, right);
}
return isVal(str, left, right);
}
}