代码改变世界

look and say 外观数列的python实现

2018-01-25 17:27  夏洛克·福尔摩斯  阅读(1071)  评论(0编辑  收藏  举报

#look_and_say 外观数列

如果我们把 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