Python虽然入门容易,但是涉及的知识点非常多,而且技巧性很强!这些技巧就像一串一串的珠子,需要一些题目不断的练手才能熟练掌握串联起来,把知识点掌握牢固!今天我就精选了3道趣味的Python题目,大家一起动动手,练起来!
1.寻找有趣的数字
给定两个整数m,n(1
例如:
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,按照如下格式:
“Phone => num,Name => name,Address => adress”
查找情况分为以下三种:
如果根据num查找出有且仅有1条文本记录,那么将上述的格式化字符串返回给John
如果根据num查找出至少有2条文本记录,返回:"Too many people: num"
如果根据num查找没有文本记录,返回:"Not found: num"
示例1:
(左右滑动查看代码)
示例2:
(左右滑动查看代码)
示例3:
(左右滑动查看代码)
菜鸟解法
思路:从电话簿中计算电话号码出现的次数,排除掉下面两种情况:
出现的次数为0 => "Error => Not found: "
出现的次数大于1次 => "Error => Too many people: "
如果出现的次数等于1次,则查找出该电话号码所在的列,然后根据正则规则查找出name,address,然后返回
点评菜鸟代码的亮点:
根据电话号码出现的次数来排除掉两种结果
最后再考虑比较复杂的情况,即电话号码只出现了一次,然后根据正则匹配出电话号码和姓名,将两者过滤掉得出地址。
高手解法:
1).将电话簿字符串除了+、之外的符号全部替换成一个空格2).将电话簿按行分割,遍历每行字符串: 按照正则匹配出相应的name,phone,address,并格式化字符串 判断phone==num,将格式化后的字符串放入结果列表中3).计算结果列表的长度,来判断最终输出结果
编程本身就是算法+数据结构的融合,而且实战性非常强!听别人道百遍说千遍不如自己动手敲一遍,很多奥妙只有在代码运行的时候才能体会,对自己的功力提升大有好处!
马上周末了,也不要忘记编程哦,欢迎大家留言讨论!
领取专属 10元无门槛券
私享最新 技术干货