问题:实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
求解本题时遇到的问题:
- 对题干理解不深,以为空格、小数点存在于任意位置;
- 小数点只能存在于E|e的前面,其后面只能跟整数;
- E|e的前面必须有数值;
- 正负号只能存在于开头及E|e后面;
- 面对问题时思维混乱,不成体系,导致漏洞百出。
本题的收获:
- 遍历string字符串时,之前考虑的用char*,但不存在string到char*/char的转换;
// 不存在从char(char*)到string的转换 char ch = s; // !!不存在从 "std::string" 到 "char" 的适当转换函数 char* ch = s; // !!不存在从 "std::string" 到 "char *" 的适当转换函数
- 想通过for(char ch : s)进行遍历,但是循环内部会对循环的进度进行调整,用该方法不会更改for循环的进程,无法使用;
- 当将指针作为函数的参数时,其函数内只是一个拷贝,对其进行操作不会影响到外部参数,所以当使用char++进行递增时,并不是对string字符串进行遍历,而是根据ASCII进行遍历。
code:
class Solution {
public:
string::iterator ch;
bool isNumber(string s) {
ch = s.begin();
if(s.empty()) return false;
while(*ch == ' ') ++ch;
bool numeric = scaninteger(ch);
if(*ch == '.'){ // 点前后任意位置有数字即可
++ch;
numeric = scanunsignedinteger(ch) || numeric;
}
if(*ch == 'e' || *ch == 'E') { // e前后均须有数字
++ch;
numeric = numeric && scaninteger(ch);
}
while(*ch == ' ') ++ch;
return numeric && *ch == '\0';
}
// 判断有无数字
bool scanunsignedinteger(string::iterator &ch){
auto before = ch;
while(*ch != '\0' && *ch >= '0' && *ch <= '9') ++ch;
return ch > before;
}
// 判断正负号是否合规及有无数字
bool scaninteger(string::iterator &ch){
if(*ch == '+' || *ch == '-') ++ch;
return scanunsignedinteger(ch);
}
};