pythonchallenge 10:网址:http://www.pythonchallenge.com/pc/return/bull.html
页面提示:len(a[30]) = ?,理解为需要计算a列表中第30个列表的长度,经过看源码,我们看到图片有点击事件,跳转到了sequence.txt,页面显示:a = [1, 11, 21, 1211, 111221,
第1数:1
第2数:1----》11, 1个1。
第3数:11----》21, 2个1。
第4数:21----》1211, 1个2,2个1。
第5数:1211----》111221, 1个1,1个2,2个1。
第6数:111221----》312211, 3个1,2个2,1个1。
第7数:312211----》13112221, 1个3,1个1,2个2,2个1。
第8数:13112221----》1113213211, 1个1,1个3,2个1,3个2,1个1。
第9数:1113213211----》31131211131221, 3个1,1个3,1个2,1个1,1个3,1个2,2个1。
法一:
1、构建一个函数,输入计算位置,计算出该字符位置及该位置之后,相同的数。例如:112223333,输入2,即计算出第3个数之后相同的数的个数3个,输入4,即计算出第5个数之后的相同个数4。
思考:考虑的两个问题:字符串a的长度为1;字符串a均为一个字符。
def strssooo(a,n):
if len(a)==1:#列表a的长度为1
return 1,a[n]
k=0
for i in range(len(a)-n):
if a[n]==a[n+i]:#判断该数是否和下一位数相等。
k+=1
if i==len(a)-n-1 and a[n+i]==a[len(a)-1]: #列表均为同一个数
return k,a[n]
else:
return k,a[n]
以上函数实现了输入任意数值,查询出该位置及该位置之后相同数的个数。返回个数和字符。
2、构建一个函数,实现一个字符串从0位置开始统计个数和字符,依次统计至尾部,返回个数+字符组合
def strssoo(a):
strat=0
k=0
txt=''
while True:
numb,strb=strssooo(a,strat)
strat+=numb
k+=numb
txt+=str(numb)+strb
if k==len(a):
return txt
以上函数实现了输入一个字符串一次返回组合后的新字符串。例如输入:‘1133555’,返回:“212335”
3、构建一个函数,实现输入第一个字符串,指定计算出某一组的字符串。例如输入:5,返回第五组字符串:“312211”,并计算出字符串长度。
def strsso(k):
a='1'
for _ in range(k):
keyss=strssoo(a)
print(keyss)
a=keyss
print(len(a))
得到结果:5808。
全部代码如下:
'''
a = [1, 11, 21, 1211, 111221,
len(a[30]) = ?
数列中第一个是1,第二个是11(表示1个1),第三个是21(表示2个1),第四个是1211(表示1个2,1个1),第五个是111221(表示1个1,1个2,2个1),第五组312211
'''
def strssooo(a,n):
if len(a)==1:#列表a的长度为1
return 1,a[n]
k=0
for i in range(len(a)-n):
if a[n]==a[n+i]:#判断该数是否和下一位数相等。
k+=1
if i==len(a)-n-1 and a[n+i]==a[len(a)-1]: #列表均为同一个数
return k,a[n]
else:
return k,a[n]
def strssoo(a):
strat=0
k=0
txt=''
while True:
numb,strb=strssooo(a,strat)
strat+=numb
k+=numb
txt+=str(numb)+strb
if k==len(a):
return txt
def strsso(k):
a='1'
for _ in range(k):
keyss=strssoo(a)
print(keyss)
a=keyss
print(len(a))
if __name__ == '__main__':
strsso(30)
法二:
思路:取出列表中第一个字符串,截取字符串第一个字符,并计数。将截取到的第一个字符与第二个字符进行比较,如果相等计数加1,不相等则将计数值、当前对比的值转变为字符串,组合记录到新的字符串中。依次循环计算直至计算到最后一个字符串。
例如:
“1”,截取的第一个字符为“1”,计数值为1。该字符也为最后一个字符,结束循环,组合记录新的字符串为“11”。
“11”,截取的第一个字符为“1”,计数值为1。截取的第二个字符为“1”,与第一个相同,计数值为2。结束循环,组合记录新的字符串为“21”。
“21”,截取的第一个字符为“2”,计数值为1。截取的第二个字符为“1”,与第一个不相同,组合记录新的字符串为“12”。将对比的字符串变更为第二个字符“1”,计数值重置1。结束循环,将计数值、当前对比的值转变为字符串(“11”),组合记录到新的字符串中,此时字符串为“1211”。
“1211”… …
依次循环计算出第30个字符串内容并且求其长度。
def strssoo(n):
a=[]
a.append("1")
for i in range(1, n):
s=""
numfi = a[i-1][0]
numbers = 1
for j in range(1, len(a[i-1])):
numtw = a[i-1][j]
if numfi != numtw:
s=s+str(numbers)
s=s+str(numfi)
numfi = numtw
numbers = 1
else:
numbers += 1
s=s+str(numbers)
s=s+str(numfi)
a.append(s)
print(len(s))
def strsso():
strssoo(31)
if __name__ == '__main__':
strsso()
输出结果为:5808
得到下一关网址:http://www.pythonchallenge.com/pc/return/5808.html