pythonchallenge10

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(表示11),第三个是21(表示21),第四个是1211(表示12,11),第五个是111221(表示11,12,21),第五组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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码字的猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值