做网站建设多少钱,佛山网站建设4-win方维,个人建筑资格证书查询,关于做网站的策划书剑指 Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值#xff08;包括整数和小数#xff09;。
数值#xff08;按顺序#xff09;可以分成以下几个部分#xff1a;
若干空格 一个 小数 或者 整数 #xff08;可选#xff09;一个 ‘e’ 或 ‘…剑指 Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值包括整数和小数。
数值按顺序可以分成以下几个部分
若干空格 一个 小数 或者 整数 可选一个 ‘e’ 或 ‘E’ 后面跟着一个 整数 若干空格 小数按顺序可以分成以下几个部分
可选一个符号字符‘’ 或 ‘-’ 下述格式之一 至少一位数字后面跟着一个点 ‘.’ 至少一位数字后面跟着一个点 ‘.’ 后面再跟着至少一位数字 一个点 ‘.’ 后面跟着至少一位数字 整数按顺序可以分成以下几个部分
可选一个符号字符‘’ 或 ‘-’ 至少一位数字 部分数值列举如下
[“100”, “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”] 部分非数值列举如下
[“12e”, “1a3.14”, “1.2.3”, “±5”, “12e5.4”]
示例 1
输入s “0” 输出true 示例 2
输入s “e” 输出false 示例 3
输入s “.” 输出false 示例 4
输入s .1 输出true
模拟
参考大佬思路 k神的有限状态机看不懂 题目定义的格式对字符串直接分段判断更直观
去掉头尾空格处理剩下部分判断是否带e/E
不带要求是整数或小数带以e/E为分隔符分为前后两部分前面要求整数或小数后面要求整数
static inline bool isSignChar(char c) {return c || c -;
}static inline bool isNumChar(char c) {return c 0 c 9;
}// 判断是否整数
static bool isInteger(const char* s, int len) {if (len 0)return false;// 判断符号字符if (isSignChar(s[0]) len 1) {s;--len;}for (int i 0; i len; i) {if (!isNumChar(s[i]))return false;}return true;
}// 判断是否小数
static bool isDecimal(const char* s, int len) {if (len 0)return false;if (isSignChar(s[0]) len 1) {s;--len;}int dot_index -1;for (int i 0; i len; i) {if (s[i] .) {if (dot_index -1)dot_index i;elsereturn false;} else if (!isNumChar(s[i]))return false;}// 至少存在 . 和一个数字return dot_index 0 ? len 1 : false;
}class Solution {
public:bool isNumber(string s) {const char* p s.c_str();int len s.length();// 跳过头尾空格const char* l p, *r p len - 1;while (l r *l ) l;while (l r *r ) --r;// 全是空格或空字符串if (l r) {return false;}// 搜索 e/Econst char* c l;while (c r *c ! e *c ! E)c;if (c r) {// 有 e/E后面跟整数return (isInteger(l, c - l) || isDecimal(l, c - l)) isInteger(c 1, r - c);} else {// 无 e/Ereturn isInteger(l, r - l 1) || isDecimal(l, r - l 1);}}
};