look and say 外觀數列的python實現

#look_and_say 外觀數列python

若是咱們把 1 做爲Look-and-say 數列的第一項,那麼,它的前幾項是這樣的:
1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, ...
在肯定了Look-and-say 數列的第一項以後,就能夠根據前一項肯定後一項的值了,在上面的示例中,咱們把 1 做爲此種數列的第一項,那麼,就能夠這樣來推導它的其他項了:
第1個是 1 時,記做 1;
第2個是讀前一個數 "2 個1", 記做 21;
第3個是讀前一個數 "1個2, 1個1", 記做 1211;
第4個是讀前一個數 "1個1,1個2,2個1", 記做 111221;

  

...
依此類推。
#模擬棧彈出的操做,以彈出的第一個值做爲其餘彈出的值比較,若是相等i++,不等,開始下一次記錄。

def LookSay(look_s):
    li = list(look_s)
    #一樣數值的計數器 i
    i= 1
    #依次彈出列表的數值
    a = li.pop(0)
    #處理look_s = '1'的狀況
    if len(li) == 0:
        return str(i) + a
    #結果集
    st = ''
    while len(li) > 0:
        s = li.pop(0)
        if a == s:
            i += 1
        else:
            st = st + str(i) + a
            a = s
            i = 1
        #處理最後彈出的狀況
        if len(li) == 0:
            st = st + str(i) + s
    return st


te = '1'
while True:
    te = LookSay(te)
    print(te)

 正則表達式處理:正則表達式

def LookSay(look_s):
    #正則表達式中的小括號"()"。是表明分組的意思。 若是再其後面出現\1則是表明與第一個小括號中要匹配的內容相同。
    #注意:\1必須與小括號配合使用
    st = ''
    for s in re.finditer(r"(\d)\1*",look_s):
        st = st + str(len(s.group(0)))+s.group(1)
    return st
相關文章
相關標籤/搜索