Python虽然入门容易,但是涉及的知识点非常多,而且技巧性很强!这些技巧就像一串一串的珠子,需要一些题目不断的练手才能熟练掌握串联起来,把知识点掌握牢固!今天我就精选了3道趣味的Python题目,大家一起动动手,练起来!
1.寻找有趣的数字
给定两个整数m,n(1 <= m <= n)我们想要找到m和n之间(包括m,n)的所有满足以下条件的整数,这个数字所有的除数的平方之和也是一个完全平方数:
例如:
-
42的除数:1,2,3,6,7,14,21,42。
-
除数的平方:1,4,9,36,49,196,441,1764。
-
平方除数的总和是:2500 显然,2500 = 50 *50
-
满足题意,所以42是一个有效的数字,应该返回[42, 2500]
菜鸟解法:
遍历m,n范围内的数字:
-
计算每个数字的所有除数的平方和z
-
判断z是否是完全平方数,满足条件,则加入到结果中
菜鸟代码:
高手解法:
-
将范围内的每个数字作为key,该数字的所有除数的平方为value,构建字典映射数据关系
-
判断字典中的value是否是完全平方数
点评:
巧妙的利用字典数据关系,将每个数字和它所有除数的平方和关系起来,节约数据空间,便于以后的操作;然后判断该平方和数是否为完全平方数,过滤出符合条件的数字。
2.蜗牛数组
给定n×n数组,将从最外层元素排列的数组元素返回到中间元素,顺时针移动。
为了更好地理解,请连续遵循下一个数组的编号:
下面这张图片更加清楚的说明了题意:
菜鸟解法:
利用递归的思想,如果列表不为空:
-
获取数组中的第一个列表中的值
-
将除去第一个列表的数组通过zip函数将列表的数组进行行转列(列转行)
点评:
菜鸟解法利用zip()函数将数组进行行转列(列转行)来解决90度取值的问题。
高手解法:
利用numpy中rot90实现数组的行转列(列转行),然后获取第一行数组值
点评:
利用numpy来将数组进行行转列(列转行),巧妙解决该问题。
3.帮助John写一个电话簿程序
John有一个旧个人电话簿文本文件。在文件的每一行,都是由姓名,电话号码和住址组成,但是这三者顺序并不固定,而且混杂着一些非字母数字的字符。
-
num格式为 + X-abc-def-ghij(其中X代表1或2个数组字)
-
<> 之间的内容为该电话号码的name
-
剩下的字符串的是address
帮助John写一个程序,让他输入他的电话簿文件的内容,和他想要查的电话号码,然后依次返回num,name和address,按照如下格式:
<span style="padding-right: 0.1px;font-size: 15px;">“Phone => num,Name => name,Address => adress”</span>
查找情况分为以下三种:
如果根据num查找出有且仅有1条文本记录,那么将上述的格式化字符串返回给John
如果根据num查找出至少有2条文本记录,返回:"Too many people: num"
如果根据num查找没有文本记录,返回:"Not found: num"
<span style="font-size: 15px;"><span role="presentation" style="font-size: 15px;padding-right: 0.1px;">“/ + 1-541-754-3010 156 Alphand_St。<J Steeve> n”</span><br /><br /><span role="presentation" style="font-size: 15px;padding-right: 0.1px;">“133,Green,Rd。<E Kustur> NY-56423; + 1-541-914-3010! n”</span><br /><br /><span role="presentation" style="font-size: 15px;padding-right: 0.1px;">“<Anastasia> + 48-421-674-8974 Via Quirinal Roma n”</span></span>
示例1:
(左右滑动查看代码)
示例2:
(左右滑动查看代码)
示例3:
(左右滑动查看代码)
菜鸟解法
思路:从电话簿中计算电话号码出现的次数,排除掉下面两种情况:
-
出现的次数为0 => "Error => Not found: "
-
出现的次数大于1次 => "Error => Too many people: "
-
如果出现的次数等于1次,则查找出该电话号码所在的列,然后根据正则规则查找出name,address,然后返回
点评菜鸟代码的亮点:
-
根据电话号码出现的次数来排除掉两种结果
-
最后再考虑比较复杂的情况,即电话号码只出现了一次,然后根据正则匹配出电话号码和姓名,将两者过滤掉得出地址。
高手解法:
1).将电话簿字符串除了+、<、>之外的符号全部替换成一个空格 2).将电话簿按行分割,遍历每行字符串: 按照正则匹配出相应的name,phone,address,并格式化字符串 判断phone==num,将格式化后的字符串放入结果列表中 3).计算结果列表的长度,来判断最终输出结果
编程本身就是算法+数据结构的融合,而且实战性非常强!听别人道百遍说千遍不如自己动手敲一遍,很多奥妙只有在代码运行的时候才能体会,对自己的功力提升大有好处!
马上周末了,也不要忘记编程哦,欢迎大家留言讨论!
往期趣味题:
牛逼了|用Python写一个微信提醒备忘录
菜鸟必收藏,13个Python惯用小技巧
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ win10如何添加python环境变量08/24
- ♥ python中的str()函数转换字符串09/30
- ♥ python3.x如何不包装输出01/04
- ♥ Google Python挑战赛:不服,就来!05/07
- ♥ python函数是否传递数组参数09/23
- ♥ 如何在python中检查两个元组是否相等09/08
内容反馈