剑指Offer20.表示数值的字符串
原题见leetcode
提交了整整23次,才通过,真菜。
就是不想看答案,因为总是1300+/1480通过,给人的感觉是就差那么一点。但是改的却非常多,最主要的还是题目都没看清,就上手了。然后就写出一坨估计自己以后都看懂的逻辑代码。一般提交10次以内不行就看答案了,所以单纯的为自己能接着提交记录一下,下次碰到这个题再优化吧
class Solution {
public boolean isNumber(String s) {
s = s.trim(); //去首尾空格
if(s.length() == 0) return false; // 空字符串单独处理
if(s.indexOf('e') != -1){ //分成4种情况,第一种是含'e'
int p = s.indexOf('e');
if(p == 0 || p == s.length() - 1) return false;
String s1 = s.substring(0, p);
String s2 = s.substring(p + 1, s.length());
return isDigital(s1) && isDigital2(s2);
}
if(s.indexOf('E') != -1){ //第二种是含'E'
int p = s.indexOf('E');
if(p == 0 || p == s.length() - 1) return false;
String s1 = s.substring(0, p);
String s2 = s.substring(p + 1, s.length());
return isDigital(s1) && isDigital2(s2);
}
boolean flag = true;
if(s.indexOf('+') == -1 && s.indexOf('-') == -1 && s.indexOf('.') == -1) { //第三种不含'+'、'-'和'.'
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) - '0' < 0 || '9' - s.charAt(i) < 0) {
flag = false;
break;
}
}
return flag;
}
return isDigital(s); //最后一种是其余情况
}
private boolean isDigital(String s1) { //处理的是可以带小数的数字
int i = s1.indexOf('.');
if(i == -1){
for (int j = 0; j < s1.length(); j++) {
if(j == 0 && (s1.charAt(0) == '+' || s1.charAt(0) == '-')){
if(s1.length() == 1) return false;
}
else if (s1.charAt(j) - '0' < 0 || '9' - s1.charAt(j) < 0){
return false;
}
}
}else {
if(i != 0) {
String str1 = s1.substring(0, i);
for (int j = 0; j < str1.length(); j++) {
if (j == 0 && (str1.charAt(0) == '+' || str1.charAt(0) == '-')) {
if(i == 1 && i == s1.length() - 1) return false;
} else if (str1.charAt(j) - '0' < 0 || '9' - str1.charAt(j) < 0) {
return false;
}
}
}
if(i != s1.length() - 1) {
String str2 = s1.substring(i + 1, s1.length());
for (int j = 0; j < str2.length(); j++) {
if (str2.charAt(j) - '0' < 0 || '9' - str2.charAt(j) < 0) {
return false;
}
}
}
if(s1.equals(".")) return false;
}
return true;
}
private boolean isDigital2(String s1) { //处理的是不带小数的数字,因为一个 'e' 或 'E' ,后面跟着一个 整数
int i = s1.indexOf('.');
if(i == -1){
for (int j = 0; j < s1.length(); j++) {
if (j == 0 && (s1.charAt(0) == '+' || s1.charAt(0) == '-')) {
if(s1.length() == 1) return false;
} else if (s1.charAt(j) - '0' < 0 || '9' - s1.charAt(j) < 0){
return false;
}
}
}else{
return false;
}
return true;
}
}