用Python实现外观数列的求解

1. 引言

事情的由来是这样的,今天遇到一个非常有意思的题目,如下:

1–11–21–1211–111221–312211

观察上述数字,找出其中的规律,并尝试思考给出下一个数字?
哇偶,可以先仔细思考一下下。。。

2. 外观数列

外观数列是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
1 被读作  "one 1"  ("一个一") , 即 1111 被读作 "two 1s" ("两个一"), 即 2121 被读作 "one 2",  "one 1""一个二" ,  "一个一") , 即 1211。
依次类推。。>>>[key for key, group in groupby('AAAABBBCCDAABBB')]
[A, B, C, D, A, B]

找出规律后,我们可以很方便的知道第6项的数字为 312211, 第7项为 13112221。
所以,我们可以编写一个函数,来自动帮我们生成这个数列的某一项。

3. 代码思路

经过思考,我们你可以总结出核心问题的求解在于我们需要统计出一组数字在序列中出现的次数。

3.1 提取输出的key

因为外观数列中每个子项都是统计数字key出现的次数,所以我们可以利用groupby函数来获取子项中需要描述的key值,样例如下:

>>>[key for key, group in groupby('AAAABBBCCDAABBB')]
[A, B, C, D, A, B]

3.2 提取每个key对应的value

正如上述输出所展示的,我们使用groupby函数将同一key进行分组。因此,我们可以对每个key对应的value进行类型转换,如下:

>>>[list(group) for key, group in groupby('AAAABBBCCDAABBB')]
[['A', 'A', 'A', 'A'], ['B', 'B', 'B'], ['C', 'C'], ['D'], ['A', 'A'], ['B', 'B', 'B']]

3.3 统计每个group对应的长度

经过上述转换,我们按照key值对数列中的子项进行了分组,进而我们可以获取每个group的长度,代码如下:

>>>[len(list(group)) for key, group in groupby('AAAABBBCCDAABBB')]
[4, 3, 2, 1, 2, 3]

3.4 整合输出

通过上述一步步的分析,我们已经很方便地使用groupby来实现我们需要的输出了,我们只需要整合每个group分组后的长度以及其key即可,代码如下:

>>>[(len(list(group)),key) for key, group in groupby('AAAABBBCCDAABBB')]
[(4, 'A'), (3, 'B'), (2, 'C'), (1, 'D'), (2, 'A'), (3, 'B')]

3.5 解决方案

正如以上的分析,我们知道元组包含每个值的计数和值本身。我们可以使用上面的逻辑,用Python来实现外观数列的求解!
代码如下:
在这里插入图片描述
我们这里打印该数列的前15项,即让参数iterator = 15,此时的输出如下:

在这里插入图片描述

4. 总结

本文通过一道非常有趣的题目引入了外观数列的定义,然后通过举例分析找出用Python实现该功能的快捷方式,最后给出了整个问题求解的样例代码。

您学废了吗?

在这里插入图片描述
关注公众号《AI算法之道》,获取更多AI算法资讯。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赵卓不凡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值