StringHandle

题目描述[原题链接][https://www.acwing.com/problem/content/description/29/]

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如,字符串"+100","5e2","-123","3.1416""-1E-16"都表示数值。

但是"12e","1a3.14","1.2.3","+-5""12e+4.3"都不是。

注意:

  1. 小数可以没有整数部分,例如.123等于0.123;
  2. 小数点后面可以没有数字,例如233.等于233.0;
  3. 小数点前面和后面可以有数字,例如233.666;
  4. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
  5. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;

样例:

1
2
3
输入: "0"

输出: true

算法描述

分类讨论:

  • 空字符串,如果为空直接返回false
  • 只有一个.字符,直接返回false;
  • 处理+-如果为正负号可以不算在遍历中,遍历:
    • 在数字0~9之间,直接跳过
    • .计数器加一,判断当前的位置是不是在e or E后面,是就返回false;如果.的个数大于1,返回false
    • e or E计数器加一,判断当前E的位置在哪,如果在字符串末尾或者前面是.并且.前面没有数字或者后面是+ or -并且为字符串结尾或者字符串只有E or e,直接返回false,否则跳过符号继续循环

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
bool isNumber(string s) {
int i=0;
while(i<s.size()&&s[i]==' ')i++;
int j = s.size()-1;
while(j>=0&&s[j]==' ')j--;
if(i>j)return false;
s = s.substr(i,j-i+1);

if(s[0]=='-'||s[0]=='+')s=s.substr(1);
if(s.empty()||s[0]=='.'&&s.size()==1)return false;

int dot = 0,e=0;
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9');
else if(s[i]=='.'){
dot++;
if(e||dot>1)return false;
}
else if(s[i]=='e'||s[i]=='E'){
e++;
if(i+1==s.size()||!i||e>1||i==1&&s[0]=='.')return false;
if(s[i+1]=='+'||s[i+1]=='-'){
if(i+2==s.size())return false;
i++;
}
}
else return false;
}
return true;
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public boolean isNumber(String s) {
if(s.length()==0)return false;
s = s.trim();
int dot=0,e=0;
int t=0;

if(s.charAt(0)=='+'||s.charAt(0)=='-'){
t=1;
}

if(s.length()-t==0||s.charAt(t)=='.'&&s.length()==t+1)return false;

for(int i=t;i<s.length();i++){
if(s.charAt(i)>='0'&&s.charAt(i)<='9')
continue;
else if(s.charAt(i)=='.'){
dot++;
if(e>0||dot>1)return false;
}
else if(s.charAt(i)=='e'||s.charAt(i)=='E'){
e++;
if(i+1==s.length()||e>1||i==t||s.charAt(i-1)=='.'&&i==1)return false;
if(s.charAt(i+1)=='+'||s.charAt(i+1)=='-'){
if(i+2==s.length())return false;
i++;
}
}
else return false;
}
return true;
}
}