进阶的路上一定少不了刷题,少不了实战,少不了日日夜夜的练习!很多人抱怨自己的功力始终没有提高,有一种书到用数方恨少的感觉,其实还是练少了,而且要精练,单题海战术也不行,提高单位时间的利用率。
刚入门的人你去刷Leetcode合适吗,你连基本的算法都不懂,轻者吐血,刷了一天没有头绪,重者从入门到放弃,选择合适的循序渐进最为重要。年前我们在小密圈选了一部分的题目,进行精刷,这些题目都是我过滤出来的,精选出来的,结合趣味和知识,淡妆浓抹总相宜。
下面我拿出其中的一道题,这一道题有5种解法,非常适合进阶提高的同学仔细推敲,一起来看一下。
检查信用卡
给定一个信用卡号码,我们可以通过一些基本知识来确定发行人/供应商是谁。
完成get_issuer()
将使用下面显示的值的功能来确定给定卡号的发卡机构。如果数字不匹配,则该函数应返回该字符串Unknown
。
测试用例:
先不要看答案,自己动手思考几分钟...
解法一:
菜鸟解法就是比较平铺直叙,数据结构上直接就用列表和字典构建,然后遍历列表进行匹配即可!
解法二:
点评这种解法非常巧妙,函数体内一行搞定,数据结构设计的时候就很妙,跟上面的不太一样。
第一,利用字典数据结构,字典是hash结构,遍历速度快,比列表要快n倍,性能上高。
第二,字典的Key设计很讲究,整体的思路也是遍历字典,但是字典的Key使用元组包裹,想到用元组作为key,这样的写法都是老手所为!
也就是信用卡的开头数组,但是字符串匹配的开头的时候如果用startswith函数,一定要是字符串类型,所以又有的map函数把数字转换为字符。
第三,利用next函数,一般next函数都是跟生成器相关的,就是不断的循环可迭代的对象。这里用next来迭代整个字典,如果遍历之后找不到,显示Unknow. 这样的写法极其老道,可能写成下面的做法,更适合理解:
解法三:
点评,这return里面大作文章这样的用法也是比较老道的,而且用了5层的if else if else ,算是5目运算了!
大部分return里面用这样的写法:
解法四:
点评,利用namedtuple这样的轻量级类完成是最好的,直观而且简洁!这种数据结构的设计非常不错。
把搜索的结果放在一个列表里面,结果是True/False ,巧妙的用了any来快速处理!省去了再次遍历的麻烦。
解法五:
用正则去匹配非常简洁,上面的匹配需要2个条件一个是startswith和len(num) in length,而正则只需要用[47].{13}这样几个字符串就描述了上面复杂的表达式,确实厉害!
实战训练
上面只是我们刷题的其中一小部分,里面还有很多精妙的招式,我都总结成pdf,并且每一道题目都详细的点评,如果静下心来好好吸收一波,一定功力大涨,收益匪浅。
现在我们要把良好的学习氛围继续下去,我们下一轮的实战一起学又要开始啦,一起实战练习,然后提问,思考,最后吸收!如果你想提高自己的 Python功力欢迎加入我们,越早加入越划算!本群已经近400人,满500人就满员了!
长按下面的二维码
从118降为99
加入星球
没有参加上一轮刷题的,不要紧我已经把总结的精华pdf放在星球里面,下一轮的实战练习群即将打响,等你一起来提高功力,不要再错过了!
上期刷题:
不废话,学Python就是这条捷径
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
内容反馈