剑指offer_【53】表示数值的字符串

1.题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

2.解题思路

(1) 先判断每个字符是否合法

(2) 正负号的位置和e不能在结尾位置

(3) 小数点只能存在一个

(4)正负号在中间位置时,前面是e后面是数字

(5)e后面不能有小数点

3.代码

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Solution {     
public boolean isNumeric(char[] str) {
String ss = String.valueOf(str);
int len = ss.length();
//先判断每个字符是否合法
for(int i=0; i<len; i++){
char c = ss.charAt(i);
if(!((c>='0' && c <= '9') || c=='e' || c=='E'|| c=='+' || c=='-'|| c=='.'))
return false;
}
////正负号,E不能在末尾
if(ss.charAt(len-1) == '+' || ss.charAt(len-1) == '-'
|| ss.charAt(len-1) == 'E' || ss.charAt(len-1) == 'e')
return false;
//判断小数点,只能有一个
if(ss.indexOf(".") != ss.lastIndexOf("."))
return false;
//正负号在中间的位置时,前面的是e,E,后面是数字
for(int i=1; i<len-1; i++){
char c = ss.charAt(i);
if(c == '+' || c=='-'){
if(!(ss.charAt(i-1) == 'e' || ss.charAt(i-1) == 'E')
||!(ss.charAt(i+1)>='0' && ss.charAt(i+1)<='9'))
return false;
}
}
////e的后面不能有数字12E+4.3
for(int i=1; i<len; i++){
char c = ss.charAt(i);
if(c == 'e' || c=='E'){
if(i==len-1)
return false;
if(ss.charAt(i+1) == '+' || ss.charAt(i+1) == '-'){
//从i+2开始往后没有小数点.则返回-1
if(ss.indexOf(".", i+2) != -1){
return false;
}
}else{
if(ss.indexOf(".", i+1) != -1){
return false;
}
}
}
}
return true;
}
}
文章目录
  1. 1. 1.题目描述
  2. 2. 2.解题思路
  3. 3. 3.代码
| 139.6k