【每日算法】LeetCode 65 —— 有效数字(一百五十七)

题目内容

有效数字(按顺序)可以分成以下几个部分:

1、一个 小数 或者 整数
2、(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数

小数(按顺序)可以分成以下几个部分:

1、(可选)一个符号字符(’+’ 或 ‘-‘)
下述格式之一:
2、至少一位数字,后面跟着一个点 ‘.’
(1)至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
(2)一个点 ‘.’ ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

1、(可选)一个符号字符(’+’ 或 ‘-‘)
2、至少一位数字

部分有效数字列举如下:

[“2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”]

部分无效数字列举如下:

[“abc”, “1a”, “1e”, “e3”, “99e2.5”, “—6”, “-+3”, “95a54e53”]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

示例

示例 1:

输入:s = “0”
输出:true

示例 2:

输入:s = “e”
输出:false

示例 3:

输入:s = “.”
输出:false

示例 4:

输入:s = “.1”
输出:true

提示

1、1 <= s.length <= 20
2、s 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-‘ ,或者点 ‘.’ 。

题解

本题是需要根据题目中给出的例子进行总结,将规则整理出来,然后一个一个代码进行实现即可,面向数据编程。

首先,总结一下需要注意的地方:

1、字符串收尾可能出现空格,需要删掉

2、e这个字符的前后如果为空,则返回false

3、e的后面不能有’.’

4、’+’、’-‘符号不能连续出现,且每个符号个数必须小于等于1

5、e和’.’最多只能出现1次,否则返回false

6、”+”、”-“、”e+”这种类型不可以出现,需要返回false

然后,进行代码实现,请看代码。

代码

class Solution {
public:
bool isNumber(string s) {
/*
1、去掉前后多余空格
2、e的前后如果是空的,则false
3、e的后面不能有'.'
4、+-不能连续出现多于1个情况
5、e和'.'最多只能出现1次
6、"+"、"-"、"e+"这种类型均不可以
*/
int l = 0, r = s.size() - 1;
while (l <= r && s[l] == ' ') l ++ ;//获取左边多余空格的数量
while (l <= r && s[r] == ' ') r -- ;//获取右边多余空格的数量
if (l > r) return false;//全是空格 返回false
s = s.substr(l, r - l + 1);//将空格去除
if (s[0] == '+' || s[0] == '-') s = s.substr(1);//开头存在+、-号可以成立,先把这删掉
if (s.empty()) return false;//如果删掉后字符串是空的,返回false;

if (s[0] == '.' && (s.size() == 1 || s[1] == 'e' || s[1] == 'E'))
//如果只有.或者.后面跟着e、E,这种写法不对,返回false
return false;

int dot = 0, e = 0;//记录.和e的次数
for (int i = 0; i < s.size(); i ++ ) {
//开始遍历字符
if (s[i] == '.') {
if (dot > 0 || e > 0) return false;
dot ++ ;
} else if (s[i] == 'e' || s[i] == 'E') {
if (!i || i + 1 == s.size() || e > 0) return false;
if (s[i + 1] == '+' || s[i + 1] == '-') {
if (i + 2 == s.size()) return false;
i ++ ;
}
e ++ ;
} else if (s[i] < '0' || s[i] > '9') return false;
}
return true;
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/05/31/【每日算法】LeetCode-65-——-有效数字(一百五十七)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号