1. 题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
1. 若干空格
2. 一个 小数 或者 整数
3. 可选)一个 ‘e‘ 或 ‘E‘ ,后面跟着一个 整数
4. 若干空格
小数(按顺序)可以分成以下几个部分:
1. (可选)一个符号字符(‘+‘ 或 ‘-‘)
2. 下述格式之一:
1. 至少一位数字,后面跟着一个点 ‘.‘
2. 至少一位数字,后面跟着一个点 ‘.‘ ,后面再跟着至少一位数字
3. 一个点 ‘.‘ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
1.(可选)一个符号字符(‘+‘ 或 ‘-‘)
2. 至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
2. 示例
示例1:
输入:s = "0"
输出:true
示例2:
输入:s = "e"
输出:false
示例3:
输入:s = "."
输出:false
示例4:
输入:s = " .1 "
输出:true
3. 提示
1 <= s.length <= 20
s
仅含英文字母(大写和小写),数字(0-9
),加号‘+‘
,减号‘-‘
,空格‘ ‘
或者点‘.‘
。
4. 题解
本题如果去找false情况就会变的很复杂,最好的是找true的情况。
可能会出现空格,首先将前空格符去掉。
遍历每一个数字:
- 如果是数字,则标记为数字
-
如果是“.”
- 判断这是第一次出现,并且没有出现过e
-
如果是“e”或“E”
- 判断这是第一次数显,并且出现过数字,
- 还需要把数字标记为false,否则如果是以e或E结尾的就会变成true,比如说123e
-
如果是“+”或“-”
- 判断是否是出现在首位
- 或者是否前面是e或E
-
其他情况
- 全为非法
5. 实现
1 class Solution {
2 public boolean isNumber(String s) {
3 if(s.length() == 0 || (" ").equals(s)) return false;
4 boolean numFlag = false; // 标记数字
5 boolean dotFlog = false; // 标记点
6 boolean eFlag = false; // 标记e或E
7 s = s.strip(); // 去掉空格符
8
9 for(int i = 0; i < s.length(); i++) {
10 char temp = s.charAt(i);
11 // 判定为数字,numFlag = true
12 if(temp >= ‘0‘ && temp <= ‘9‘) {
13 numFlag = true;
14 }
15 // 判定为".",需要没有出现过,并且没有出现过e
16 else if(temp == ‘.‘ && !dotFlog && !eFlag) {
17 dotFlog = true;
18 }
19 // 判定为e,需要没出现过E,并且出现过数字
20 else if((temp == ‘e‘ || temp == ‘E‘) && !eFlag && numFlag) {
21 eFlag = true;
22 numFlag = false; // 出现e后就标记为false
23 }
24 // 判定为+/-符号,只能出现在第一位或者紧接e后面
25 else if((temp == ‘+‘ || temp == ‘-‘) && (i == 0 || s.charAt(i - 1) == ‘e‘ || s.charAt(i - 1) == ‘E‘)) {
26
27 }
28 // 其他情况都是非法的
29 else {
30 return false;
31 }
32 }
33 return numFlag;
34 }
35 }
6. 结语
努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!
如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。