本题参考:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/jian-zhi-offer-20-biao-shi-shu-zhi-de-zi-060v/
采用遍历字符串判断的方法,步骤如下:
1.首先定义4个标志位,即:
1.1 has_num
,表示之前是否存在数字
0
−
9
0-9
0−9
1.2 has_e
,表示之前是否存在
e
e
e或者
E
E
E
1.3 has_sign
,表示之前是否存在
+
+
+或者
−
-
−
1.4 has_dot
,表示之前是否存在小数点
.
.
.
2.定义字符串长度n
以及字符串索引index
3.处理开头的空格,index
相应地往后移
4.进入循环,遍历字符串
4.1 如果当前字符是数字:将has_num
置为True
,index
往后移动,一直到非数字或者遍历到末尾位置,如果已经遍历到末尾(即index == n
),结束循环
4.2 如果当前字符是
e
e
e(或者
E
E
E):如果
e
e
e(或者
E
E
E)已经出现或者当前
e
e
e(或者
E
E
E)之前没有出现过数字,返回False
,否则令has_e
为True
,并且将其他3个标志位全部置为False
,将has_num
和has_sign
置为False
是因为
e
e
e(或者
E
E
E)后面需要跟上新的数字,将has_dot
置为False
是因为
e
e
e(或者
E
E
E)后面不能出现小数点
.
.
.
4.3 如果当前字符是
+
+
+(或者
−
-
−):如果已经出现过
+
+
+(或者
−
-
−)或者已经出现过数字或者已经出现过
.
.
.,返回False
,否则令has_sign
为True
4.4 如果当前字符是
.
.
.:如果已经出现过
.
.
.或者已经出现过
e
e
e(或者
E
E
E),返回False
,否则令has_dot
为True
4.5 如果当前字符是除了上面4种情况以外的其他字符,返回False
5.处理末尾的空格,index
相应地往后移
6.如果当前索引index
与字符串长度n
相等,说明遍历到了末尾,但还要满足has_num
为True
才可以返回最终的True
,因为如果字符串中全是符号没有数字是不行的,而且
e
e
e(或者
E
E
E)后面没有数字也是不行的,但是没有符号是可以的,所以4个标志位中只要判断has_num
就行,最终返回has_num and index == n
7.如果字符串中间存在空格,就跳出循环,按以上思路是无法遍历到末尾的,index
不会与n
相等,因此返回的就是False
根据以上思路,代码如下:
class Solution:
def isNumber(self, s: str) -> bool:
has_num = has_e = has_sign = has_dot = False
n, index = len(s), 0
while index < n and s[index] == ' ':
index += 1
while index < n:
if '0' <= s[index] <= '9':
has_num = True
if index == n:
break
elif s[index] == 'e' or s[index] == 'E':
if has_e or not has_num:
return False
has_e, has_num, has_sign, has_dot = True, False, False, False
elif s[index] == '+' or s[index] == '-':
if has_sign or has_num or has_dot:
return False
has_sign = True
elif s[index] == '.':
if has_dot or has_e:
return False
has_dot = True
elif s[index] == ' ': # 如果字符串中间存在空格,那就跳出循环
break
else:
return False
index += 1
while index < n and s[index] == ' ':
index += 1
return has_num and index == n
时间复杂度分析
本方法中存在3个while
循环,但它们不是嵌套的关系,因此时间复杂度为
O
(
n
)
O(n)
O(n)。