题解 | #表示数值的字符串#
表示数值的字符串
http://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8
剑指Offer书中的题解
对于一个数值字符串,可以将其分解成:
- A[.B][E|eC]
- .B[E|eC]
两种情况,其中A是整数部分,B是小数部分,C是指数部分 []表示这是一个整体,这个整体必须同时出现 A C可能以'+'或'-'号开头,B不会,只能是以数字开头。
按照上面提到的两种模式,开始遍历
- 清空开头的空格
- 检查A是否合法
- 检查是否有.
- 有 则检查B
- 无 跳过
- 检查是否有E | e
- 有 则检查C
- 无 跳过
- 清空末尾的空格
- 判断是否到末尾,并且前面都合法。
上代码
class Solution {
public:
int i = 0; //全局遍历变量
//用于判断A C是否合法
bool scanIntger(string str){
//如果开头有正负号则跳过
if(str[i]=='+' || str[i]=='-'){
i++;
}
return scanfUnsignIntger(str);
}
// 用于判断B是否合法
bool scanfUnsignIntger(string str){
int k = i;//记录开头位置
while('0'<=str[i] && str[i]<='9'){
i++;
}
// 如果有数字,则i会向前移动,i>k
// 如果没有数字,则i不会移动,说明不合法
return i>k;
}
bool isNumeric(string str) {
// write code here
// 清空开头的空格
while(str[i]==' ') i++;
// 检查A是否合法
bool ans = scanIntger(str);
if(i<str.size() && str[i]=='.'){
i++;
//检查B是否合法
ans = scanfUnsignIntger(str) || ans;
}
if(i<str.size() && (str[i]=='E'|| str[i]=='e')){
i++;
// 检查C是否合法
// 注意这里是 && 当e前面没有数字时,整个字符串不能表示数字
// 当e后面没有数字时,整个字符串不能表示数字
// scanInger检测e后面有没有数字,ans表示前面有没有数字 两个条件必须同时满足
ans = scanIntger(str) && ans;
}
// 清空结尾的空格
while(str[i]==' ') i++;
if(ans==true && i==str.size()){
return true;
}else{
return false;
}
}
};