知行编程网知行编程网  2022-03-23 10:00 知行编程网 隐藏边栏 |   抢沙发  20 
文章评分 0 次,平均分 0.0

Python虽然入门容易,但是涉及的知识点非常多,而且技巧性很强!这些技巧就像一串一串的珠子,需要一些题目不断的练手才能熟练掌握串联起来,把知识点掌握牢固!今天我就精选了3道趣味的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是否是完全平方数,满足条件,则加入到结果中


菜鸟代码:

推荐3道趣味Python题,菜鸟来挑战一下


高手解法:

  • 将范围内的每个数字作为key,该数字的所有除数的平方为value,构建字典映射数据关系

  • 判断字典中的value是否是完全平方数

推荐3道趣味Python题,菜鸟来挑战一下


点评:

巧妙的利用字典数据关系,将每个数字和它所有除数的平方和关系起来,节约数据空间,便于以后的操作;然后判断该平方和数是否为完全平方数,过滤出符合条件的数字。



2.蜗牛数组


给定n×n数组,将从最外层元素排列的数组元素返回到中间元素,顺时针移动。


为了更好地理解,请连续遵循下一个数组的编号:


下面这张图片更加清楚的说明了题意:

推荐3道趣味Python题,菜鸟来挑战一下


菜鸟解法:

利用递归的思想,如果列表不为空:

  • 获取数组中的第一个列表中的值

  • 将除去第一个列表的数组通过zip函数将列表的数组进行行转列(列转行)


推荐3道趣味Python题,菜鸟来挑战一下

点评:

菜鸟解法利用zip()函数将数组进行行转列(列转行)来解决90度取值的问题。


高手解法:

利用numpy中rot90实现数组的行转列(列转行),然后获取第一行数组值

推荐3道趣味Python题,菜鸟来挑战一下


点评:

利用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,然后返回


推荐3道趣味Python题,菜鸟来挑战一下

点评菜鸟代码的亮点:

  • 根据电话号码出现的次数来排除掉两种结果

  • 最后再考虑比较复杂的情况,即电话号码只出现了一次,然后根据正则匹配出电话号码和姓名,将两者过滤掉得出地址。


高手解法:

1).将电话簿字符串除了+、<、>之外的符号全部替换成一个空格 2).将电话簿按行分割,遍历每行字符串:  按照正则匹配出相应的name,phone,address,并格式化字符串  判断phone==num,将格式化后的字符串放入结果列表中 3).计算结果列表的长度,来判断最终输出结果

推荐3道趣味Python题,菜鸟来挑战一下


编程本身就是算法+数据结构的融合,而且实战性非常强!听别人道百遍说千遍不如自己动手敲一遍,很多奥妙只有在代码运行的时候才能体会,对自己的功力提升大有好处!


马上周末了,也不要忘记编程哦,欢迎大家留言讨论!


往期趣味题:

牛逼了|用Python写一个微信提醒备忘录

菜鸟必收藏,13个Python惯用小技巧



本篇文章来源于: 菜鸟学Python

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享