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
技术成就现在,眼光着看未来。