1. 程式人生 > >Leetcode演算法——65、有效數字(valid number)

Leetcode演算法——65、有效數字(valid number)

判斷一個字串是否可以被翻譯為一個小數。

在一個有效的小數中,可能存在的字元有:
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))