【剑指 Offer 20. 表示数值的字符串 中等】
【剑指 Offer 20. 表示数值的字符串 中等】
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。".123"是。自动忽略首尾的空格
一个符合条件的数字格式为:[sign](0-9)[.][ [e/E] [sign](0-9) ]。具体细节参照代码
class Solution { public: bool scanUnsignedNumber(string s, int& i, int len) { int before = i; while(i < len && s[i] >= '0' && s[i] <= '9') ++i; return i > before; } bool scanNumber(string s, int& i, int len) { if(s[i] == '+' || s[i] == '-') ++i; return scanUnsignedNumber(s, i, len); } bool isNumber(string s) { int len = s.length(); if(len == 0) return false; int i = 0; while(s[i] == ' ') ++i; bool isNumber = scanNumber(s, i, len); cout<<isNumber<<endl; if(s[i] == '.') { ++i; cout<<"*"<<i<<" "<<len<<endl; isNumber = scanUnsignedNumber(s, i, len) || isNumber; // 处理“.123”的这种情况 } if(s[i] == 'e' || s[i] == 'E') { ++i; isNumber = isNumber && scanNumber(s, i, len); } while(s[i] == ' ') ++i; return i == len && isNumber; } };