剑指offer20表示数值的字符串
Posted shiganquan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer20表示数值的字符串相关的知识,希望对你有一定的参考价值。
题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路
主要搞清楚表示数值的具体情况是怎么样的
A [.[B]] [e|E C] 或者 .B [e|E C]
其中,中括号表示可有可无。A和C可以是带符号数,B必须是无符号数。
搞清楚后,代码就不难写,一步步扫描。
class Solution { public: bool isNumeric(const char* str) { if(str == nullptr) return false; bool numeric = scanInteger(&str); // 如果出现‘.‘,接下来是数字的小数部分 if(*str == ‘.‘) { ++str; // 下面一行代码用||的原因: // 1. 小数可以没有整数部分,例如.123等于0.123; // 2. 小数点后面可以没有数字,例如233.等于233.0; // 3. 当然小数点前面和后面可以有数字,例如233.666 numeric = scanUnsignedInteger(&str) || numeric; } // 如果出现‘e‘或者‘E‘,接下来跟着的是数字的指数部分 if(*str == ‘e‘ || *str == ‘E‘) { ++str; // 下面一行代码用&&的原因: // 1. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1; // 2. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4 numeric = numeric && scanInteger(&str); } return numeric && *str == ‘