剑指 Offer 20. 表示数值的字符串
这是题目给出的定义,我们只需要按照题目给出的定义完成函数的编写即可
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数- 若干空格
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
)- 下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字- 一个点
'.'
,后面跟着至少一位数字整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
)- 至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
解题思路:文章来源:https://www.toymoban.com/news/detail-463683.html
- 去掉首尾空格,l 记录数字开始位置,r记录数字结束位置
- 查找 l 到 r 之间是否存在e,如果存在e,posE记录e的位置
- 如果不存在E,先判断posE+1到r是否为整数,在判断 l 到posE-1之间是否为整数或者小数
小数的判断:文章来源地址https://www.toymoban.com/news/detail-463683.html
- 先找到 . 的位置posDot
- 再判断 l 到 posDot-1 和 posDot+1到 r 是否为整数
class Solution {
public:
bool isNumber(string s)
{
// 第一步,去掉首尾空格,l记录数字开始位,r记录数字结束位
int l = 0, r = s.size() - 1;
while (l < s.size() && s[l] == ' ') ++ l;
while (r >= 0 && s[r] == ' ') -- r;
if (l > r) return false;
// 第二步,查找l到r之间是否存在e,若存在e,posE记录e的位置
int posE = l - 1;
for (int i = l; i <= r; ++ i)
{
if (s[i] == 'e' || s[i] == 'E')
{
posE = i;
break;
}
}
// 第三步,
bool res = false;
// 如果不存在E,直接判断 l 到 r 之间是否为整数或者小数
if (posE == l - 1)
{
if (s[l] == '+' || s[l] == '-') ++ l;
res = isFraction(l, r, s) || isInteger(l, r, s);
}
// 如果存在E,先判断 posE + 1 到 r 是否为整数,再判断 l 到 posE - 1 之间是否为整数或者小数
else
{
int second_l = posE + 1;
if (s[second_l] == '+' || s[second_l] == '-') ++ second_l;
res = isInteger(second_l, r, s);
if (s[l] == '+' || s[l] == '-') ++ l;
res = res && (isFraction(l, posE - 1, s) || isInteger(l, posE - 1, s));
}
return res;
}
// 判断 l 到 r 是否为整数
bool isInteger(int l, int r, string& s)
{
if (l > r) return false;
for (int i = l; i <= r; ++ i)
{
if (s[i] > '9' || s[i] < '0')
return false;
}
return true;
}
// 判断 l 到 r 是否为小数
bool isFraction(int l, int r, string& s)
{
// 小数判断同理,先找到 . 的位置 posDot
// 再判断 l 到 posDot - 1,posDot + 1 到 r 是否为整数
if (r - l < 1) return false;
int posDot = l - 1;
for (int i = l; i <= r; ++ i)
{
if (s[i] == '.')
{
posDot = i;
break;
}
}
if (posDot == l - 1) return false;
else if (posDot == l) return isInteger(posDot + 1, r, s);
else if (posDot == r) return isInteger(l, posDot - 1, s);
else return isInteger(l, posDot - 1, s) && isInteger(posDot + 1, r, s);
}
};
到了这里,关于剑指 Offer 20. 表示数值的字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!