Leetcode演算法——65、有效數字(valid number)
阿新 • • 發佈:2018-12-26
判斷一個字串是否可以被翻譯為一個小數。
在一個有效的小數中,可能存在的字元有:
1、數字0-9
2、正負號 +/-
3、小數點 .
示例:
"0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true " -90e3 " => true " 1e" => false "e3" => false " 6e-1" => true " 99e2.5 " => false "53.5e93" => true " --6 " => false "-+3" => false "95a54e53" => false
思路
通過示例可以看出一些規則:
- 首尾的多個空格可以忽略
- 正負號不能相鄰
- 如果有出現了e,那麼e前面可以是小數,e後面只能是整數(可以是負數)
- 除了e,不能出現其他任何字母
- “1.” 或者 “.1” 都認為是正確的小數
可以使用正則式匹配,將這些規則統一到一個正則式中,如果可以匹配到,則說明符合規則。
正則式的一些語法:
?:匹配前面的子表示式零次或一次 +:匹配前面的子表示式一次或多次 *:匹配前面的子表示式零次或多次 .:匹配除換行符 \n 之外的任何單字元 ^:匹配輸入字串的開始位置,除非在方括號表示式中使用,此時它表示不接受該字元集合。 $:匹配輸入字串的結尾位置
以上特殊字元如果要匹配本身的話,需要在前面加上\
。
python實現
import re
def isNumber(s):
"""
:type s: str
:rtype: bool
"""
s = s.strip()
p1 = r'([0-9]+)' # 整數
p2 = r'(([0-9]+)?\.([0-9]+))' # 小數,.前面可以為空
p3 = r'(([0-9]+)\.)' # 小數,.後面為空
p4 = f'((\+|-)?({p1}|{p2}|{p3}))' # 小數或整數的正則表示式
p5 = f'^({p4}|({p4}e(\+|-)?{p1}))$' # 只有小數,或者e前面為小數,e後面為整數
if re.match(p5, s):
return True
else:
return False
if '__main__' == __name__:
s = ""
print(isNumber(s))