PAT 1140 Look-and-say Sequence python解法

博客介绍了PAT 1140题目的Look-and-Say序列,这是一种特殊的整数序列。内容涉及序列的定义、示例及解题思路,解释了如何根据序列的特性生成下一个数。给出了1的前几个序列作为示例,并提出通过分析序列元素的排列来构造解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1140 Look-and-say Sequence (20 分)
Look-and-say sequence is a sequence of integers as the following:

D, D1, D111, D113, D11231, D112213111, …
where D is in [0, 9] except 1. The (n+1)st number is a kind of description of the nth number. For example, the 2nd number means that there is one D in the 1st number, and hence it is D1; the 2nd number consists of one D (corresponding to D1) and one 1 (corresponding to 11), therefore the 3rd number is D111; or since the 4th number is D113, it consists of one D, two 1’s, and one 3, so the next number must be D11231. This definition works for D = 1 as well. Now you are supposed to calculate the Nth number in a look-and-say sequence of a given digit D.

Input Specification:
Each input file contains one test case, which gives D (in [0, 9]) and a positive integer N (≤ 40), separated by a space.

Output Specification:
Print in a line the Nth number in a look-and-say sequence of D.

Sample Input:
1 8
Sample Output:
1123123111

解题思路:题目要求的其实就是看字符串中元素的排列。比如,对于这个字符串:115248,它就是2个1,1个5,1个2,1个4,1个8组成的字符串,它的look-and-say sequence是12 51 21 41 81(加空格方便观察)。
再比如题目中给出的1的前9个look-and-say sequence分别是(加空格方便观察):
1 (初始值)
11 (1个1)
12 (2个1)
11 21 (1个1、1个2)
12 21 11 (2个1、1个2、1个1)
11 22 13 (1个1、2个2、3个1)
12 22 11 31 (2个1、2个2、1个1、1个3)
11 23 12 31 11 (1个1、3个2、2个1、1个3、1个1)
12 21 31 11 21 31 13 (2个1、1个2、1个3、1个1、1个2、1个3、3个1)
从手工求解的思路出发,很容易就可以写出来。

d, n = map(int,input().split())
#d, n = 1, 8
seq = str(d) + '1'
#seq = 'd1'
def look_and_say(seq):
    count = 1
    s = ''
    for i in range(1,len(seq)):
        if seq[i] == seq[i-1]:
            #对比前后两个数,相同则计数器加1
            count += 1
        else:
            #不同则输出数数结果,并将计数器置1
            s += seq[i-1] + str(count) 
            count =1
    #循环结束后将最后一轮数数结果加上
    s += seq[-1] + str(count)
    return s
#print(look_and_say(seq))
#分情况输出
if n == 1:
    print(d)
elif n == 2:
    print(seq)
elif n>2:   
    for i in range(n-2):
        seq = look_and_say(seq)
    print(seq)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

D_ry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值