AcWing打卡活动
《剑指Offer》打卡活动
周二第八题 表示数值的字符串
/**
* 字符串有两种开头方式
* 其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟'e'或者'E'为数值的指数部分
* a. 以A为整数部分的开头 A[.[B]][e|EC]
*
* b. 以.B为小数部分的开头 .B[e|EC]
* 其中,整数部分开头是可以有±号的,而小数部分是不能有±号的
* 注意:需要多注意越界问题
*
*/
class Solution {
int index = 0;
public boolean isNumber(String s) {
char[] sCharArr = s.toCharArray();
// 先测试第a种情况
boolean numeric = scanInteger(sCharArr);
// 是否为小数开头
if(index < sCharArr.length && sCharArr[index] == '.') {
index++;
// 若不为情况a,则试试是否为情况b
numeric = scanUnsignedInteger(sCharArr) || numeric;
}
if(index < sCharArr.length && (sCharArr[index] == 'e' || sCharArr[index] == 'E')) {
index++;
// e不能开头,所以使用&&
numeric = numeric && scanInteger(sCharArr);
}
return numeric && index == sCharArr.length;
}
// 扫描是否有正负符号
public boolean scanInteger(char[] sCharArr) {
if(index + 1 < sCharArr.length && (sCharArr[index] == '+' || sCharArr[index] == '-')) {
index++;
}
// 扫描完正负号之后,扫描整数部分
return scanUnsignedInteger(sCharArr);
}
// 是否有数字0~9存在
public boolean scanUnsignedInteger(char[] sCharArr) {
// before 用于记录是否扫描出了数字1~9
int before = index;
while(sCharArr.length != index && sCharArr[index] >= '0' && sCharArr[index] <= '9') {
index++;
}
// 若index移动了,则有整数存在,否则则不存在
return before < index;
}
}