剑指 Offer 20. 表示数值的字符串
来源:力扣(LeetCode) 链接:力扣
-> 符合 A[.[B]][e|EC] 或 .B[e|EC] 形式 即为表示数值的字符串,返回 true
其中A、C为整数、B为无符号整数
// ->符合 A[.[B]][e|EC] 或 .B[e|EC] 形式
// 其中A、C为整数、B为无符号整数
// 判断是否为 无符号整数
bool scanUnsignedInt(string& s, int& index)
{
int preIndex = index;
while (index < s.size() && s[index] >= '0' && s[index] <= '9')
{
++index;
}
return index > preIndex;
}
// 判断是否为 整数
bool scanInt(string& s, int& index)
{
if (index < s.size() && (s[index] == '+' || s[index] == '-'))
{
++index;
}
return scanUnsignedInt(s, index);
}
bool isNumber(string s) {
// base case
if (s.empty())
{
return false;
}
int index = 0;
while (index < s.size() && s[index] == ' ') // 除去前置空格
{
++index;
}
bool res = scanInt(s, index); // 扫描A部分
if (index < s.size() && s[index] == '.')
{
++index;
res = scanUnsignedInt(s, index) || res; // 扫描B部分
}
if (index < s.size() && (s[index] == 'e' || s[index] == 'E'))
{
++index;
res = res && scanInt(s, index); // 扫描C部分
}
while (index < s.size() && s[index] == ' ') // 除去后置空格
{
++index;
}
return res && index == s.size();
}
坑
res = scanUnsignedInt(s, index) || res; // 扫描B部分
顺序很重要,不可写成 res || scanUnsignedInt(s, index)
否则 scanUnsignedInt(s, index) 很可能不被执行