65. 有效数字
题目介绍
有效数字(按顺序)可以分成以下几个部分:
一个 小数 或者 整数
(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(‘+’ 或 ‘-’)
下述格式之一:
至少一位数字,后面跟着一个点 ‘.’
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(‘+’ 或 ‘-’)
至少一位数字
部分有效数字列举如下:[“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
提示:
1 <= s.length <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,或者点 ‘.’ 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解
考虑有三种情况:
- 整数x = +/-a
- 小数y = +/-a.b / ±.b / ±a.
- 指数z = +/-ae+/-b = x1ex2 / yex
因为我们需要一个判断整数的的函数和一个判断小数的函数
首先检索一遍字符串,查找到 e 的位置,
如果没有 e ,则直接判断字符串是整数 || 小数;
如果有 e ,则判断 e 左边的字符串是整数 || 小数,并且 e 的右边是整数。
class Solution {
public:
bool isInt(string s, int a, int b)
{
if(s[a]=='+' || s[a]=='-')
{
a++;
}
if(a>b) // 考虑只有一个正负号
{
return false;
}
while(a<=b)
{
if(s[a]<'0' || s[a]>'9')
{
return false;
}
a++;
}
return true;
}
bool isSmall(string s, int a, int b)
{
// 跳过正负号
if(s[a]=='+' || s[a]=='-')
{
a++;
}
int i=a, j;
while(i<=b && s[i]>='0' && s[i]<='9')
{
i++;
}
// 如果只有整数,或者整数之后的字符不是'.'
if(i>b || s[i]!='.')
{
return false;
}
// s[i]='.'
j = i+1;
while(j<=b && s[j]>='0' &&s[j]<='9')
{
j++;
}
// 如果第二个整数之后还有字符
if(j<=b)
{
return false;
}
// x.y中x和y不能都长度为0
if(i-a==0 && j-i==1)
{
return false;
}
return true;
}
bool isNumber(string s) {
int i;
for(i=0;i<s.size();i++)
{
if(s[i]=='e'||s[i]=='E')
{
break;
}
}
if(i==s.size()) //字符串中没e
{
return isInt(s, 0, i-1) || isSmall(s, 0, i-1);
}
int len_l = i, len_r = s.size()-i-1;
if(len_l==0 || len_r==0) //e9 9e e false
{
return false;
}
bool left = isInt(s, 0, i-1) || isSmall(s, 0, i-1);
bool right = isInt(s, i+1, s.size()-1);
return left&&right;
}
};