原题
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一次编码
class Solution {
public:
bool scanUnsignedNumber(const string & s, int & i)
{
int i0 = i;
while(i < s.size() && s[i] >= '0' && s[i] <= '9')
{
i++;
}
if(i > i0)
return true;
else
return false;
}
bool scanNumber(const string & s, int & i)
{
if(i >= s.size())
return false;
if(s[i] == '+' || s[i] == '-')
i++;
return scanUnsignedNumber(s, i);
}
bool isNumber(string s) {
if(0 == s.size())
return false;
string::iterator iter = s.begin();
while(' ' == *iter)
{
iter++;
}
s.erase(s.begin(), iter);
iter = s.end()-1;
while(' ' == *iter)
{
iter--;
}
s.erase(iter+1, s.end());
int i = 0;
bool res = scanNumber(s, i);
if(i < s.size() && '.' == s[i])
{
i++;
res = res || scanUnsignedNumber(s, i);
}
if(i < s.size() && ('e' == s[i] || 'E' == s[i]))
{
i++;
res = res && scanNumber(s, i);
}
return res && (s.size() == i);
}
};
结果
问题
在 res = res || scanUnsignedNumber(s, i);
处,res 在上一步的值为 true,在这一步中,不会执行或运算符 || 后面的部分。
解决办法
在写C++程序时,碰到到逻辑变量与返回值为逻辑值的函数做与或运算时,将函数放前面,保证函数会被执行。
第二次编程
class Solution {
public:
bool scanUnsignedNumber(const string & s, int & i)
{
int i0 = i;
while (i < s.size() && s[i] >= '0' && s[i] <= '9')
{
i++;
}
if (i > i0)
return true;
else
return false;
}
bool scanNumber(const string & s, int & i)
{
if (i >= s.size())
return false;
if (s[i] == '+' || s[i] == '-')
i++;
return scanUnsignedNumber(s, i);
}
bool isNumber(string s) {
if (0 == s.size())
return false;
string::iterator iter = s.begin();
while (' ' == *iter)
{
iter++;
}
s.erase(s.begin(), iter);
iter = s.end() - 1;
while (' ' == *iter)
{
iter--;
}
s.erase(iter + 1, s.end());
int i = 0;
bool res = scanNumber(s, i);
if (i < s.size() && '.' == s[i])
{
i++;
// res = res || scanUnsignedNumber(s, i);
res = scanUnsignedNumber(s, i) || res;
}
if (i < s.size() && ('e' == s[i] || 'E' == s[i]))
{
i++;
res = res && scanNumber(s, i);
}
return res && (s.size() == i);
}
};