题解 | #表示数值的字符串#
表示数值的字符串
https://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8
class Solution {
public:
int id = 0; // 全局遍历方式
// 查询是否为+-号,若是,后一位必然为整数才符合数值
bool has_symhol(string str)
{
if(id < str.size() && (str[id] == '-' || str[id] == '+' ))
id++;
return integer(str);
}
// 判断后一位是否为整数,若一直是,则不断更新id的数值
bool integer(string str){
int tmp = id;
while(id < str.size() &&(str[id] >= '0' && str[id] <= '9'))
id++;
return id > tmp;
}
bool isNumeric(string str) {
// write code here
// 去除开始空格
if (str.empty()) return false;
while (str[id] == ' ' && id < str.size()) { // 注意迭代边界
id++;
}
int n = str.size() - 1; // 记得包含最后一个隐藏字段'\n'
while (str[n] == ' '&& n >= 0) { // 注意迭代边界
n--;
}
std::cout << " str size : " << str.size() << " " << id << " " << n << std::endl;
if(id > n) return false; // 全是空格时,则非数值字符串
// flag记录当前走过的字符符合数值情况
bool flag = has_symhol(str); // 检查一下 + - 存在情况
// 若为带符号的数值,则判断过程中id已更新到下一个,至少下次遍历至id+2
std::cout << flag << id << std::endl;
// 如有.
if(id <= n && str[id] == '.'){
id++;
flag = integer(str) || flag; // 若为带符号数值,则小数点后可为E? 是的,-1.E4表示-40000
// . 后一位只能跟数字则才为true
}
std::cout << flag << id << std::endl;
// 若有e,后面一位到最后只能为数字才符合科学计数法
if(id <= n && (str[id] == 'e' || str[id] == 'E'))
{
id++;
flag = has_symhol(str) && flag;
}
std::cout << flag << id << std::endl;
return flag&&(id == n+1); // id == n +1 表示好好遍历到最后一个位置了。记得别漏最后‘\n’
}
};
挤挤刷刷! 文章被收录于专栏
记录coding过程
查看9道真题和解析