Hello 大家好,我是Alex,今天来说明一下Matrix工作室每日一题的刷题指南,虽然刷题一直饱受诟病,很多人不想刷题,但不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会。
现在提供的在线编程评测平台有很多,并且也分了两个方向,一个是偏向于面试找工作,比较著名的就是LeetCode,另一个是偏向于算法竞赛,比较著名的有CodeForce,UVA等等,我们经常说的打CF可不是穿越火线,而是CodeForce,这两个不仅完全没有关系,并且难度也不是一个层级的。
咱们今天还是重点说说LeetCode这个平台,这是一个非常棒的OJ(Online Judge)平台,收集了许多公司的面试题目,相对其他OJ而言,LeetCode具有很多优点:
题目全部来自业内大厂的真实面试题;不用处理输入输出,精力全放在解决具体问题上;题目由丰富的题解,可以参考别人的思路;精确了解自己的代码在所有提交代码中运行效率的排名;支持多种主流语言:C/C++、Python、Java、Js、Go等等。废话不多说,那我们接下来就开始。
用LeetCode之前首先你肯定得有一个账号,可以是QQ或者微信登录,也可以用GitHub登录。
其实LeetCode是有每日一题的,比如今天的:
一般来说,平常工作日都是简单或者中等难度的题目,大概十几分钟就能解决,有些比较麻烦的可能需要几十分钟,周末经常会出困难级别的题目,光思路就得想十几分钟,实现出来又得十几分钟,然后花时间调试和改bug,最后终于AC(Accepted)了,还得去题解学习学习大师级别的代码,基本上一个多小时过去了。
当然,咱们工作室的每日一题也会从LeetCode上出,但并不一定是LeetCode上的每日一题,因为考虑到一些大一的同学并没有学过算法和数据结构,所以各个组长会根据组员的学习进度,先从简单的题目中找适合你们的题目,布置成作业,等大家逐渐熟练之后,会慢慢的转为LeetCode上的每日一题,这样就统一了。
以今天的每日一题:925. 长按键入为例,我们进入问题详情页后:
可以看到左边是题目描述以及一些输入输出样例,右边是在线代码编辑区,我们等会提交代码就得从这里提交。
简单读一下题目925. 长按键入,有的时候题目会比较晦涩难懂,尤其是一些英文翻译题甚至直接就是英文题目,这个时候也不用慌,有的时候题目没读懂也没关系,我们可以研究研究输入输出样例。
如果能把输入输出样例搞懂了,那也能把题做对。
读懂了题目之后,我们要做三件事:
解题思路;确定算法;确定数据结构。这题呢比较简单,所以我们就简单说一下思路就可以了。
通过题意可以知道,就是判断name是否为typed的子序列,我们可以使用双指针i, j追踪name和typed的位置,依次判断当前遍历的字符是否相等,如果不等的话,判断是否是长按键入多次了,如果不是,那就返回False,到最后,如果i = len(name),说明name的每个字符都被匹配了。
然后我们就可以开始写代码了,之前我们说过,在LeetCode上我们不需要花时间处理输入和输出,它在后台评判的时候已经帮我们做好了,我们只需要实现具体的代码逻辑。
以Python3为例:
class Solution: def isLongPressedName(self, name: str, typed: str) -> bool:对于还没学过类和对象的同学,简单说一下这是什么,不需要了解具体的意义,知道怎么做就行。
我们一般不直接在LeetCode的在线编辑器上写代码,一点都不舒服,所以我们把它复制到PyCharm,然后写一个模板:
class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: pass if __name__ == '__main__': s = Solution() print(s.isLongPressedName(name="alex", typed="aaleex"))这个模板呢,基本上是通用的,就是在主函数里实例化一个Solution()对象s,然后通过s调用相应的方法isLongPressedName,能运行通之后,我们就可以在isLongPressedName中编写相应的算法逻辑了。
class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: i, j = 0, 0 while j < len(typed): if i < len(name) and name[i] == typed[j]: i += 1 j += 1 elif j > 0 and typed[j] == typed[j - 1]: j += 1 else: return False return i == len(name) if __name__ == '__main__': s = Solution() print(s.isLongPressedName(name="alex", typed="aaleex")) print(s.isLongPressedName(name="saeed", typed="ssaaedd")) print(s.isLongPressedName(name="leelee", typed="lleeelee"))最后我们把写完的Solution()类复制回LeetCode的在线编辑器,提交评测,通过了之后,你就可以看到你的代码在所有提交代码中运行效率的排名,然后还可以分享你的解题思路。
那如果我们写的代码逻辑有问题,没有通过评测呢,我们来试一下提交一个错误的代码:
class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: i, j = 0, 0 while j < len(typed): if i < len(name) and name[i] == typed[j]: i += 1 j += 1 elif j > 0 and typed[j] == typed[j - 1]: i += 1 j += 1 else: return False return i == len(name)它会给我们显示解答错误,并且呢提供执行错误的输入输出样例。
还有一种错误是我们的语法有问题,比如我们少了一个冒号:
class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: i, j = 0, 0 while j < len(typed): if i < len(name) and name[i] == typed[j]: i += 1 j += 1 elif j > 0 and typed[j] == typed[j - 1] i += 1 j += 1 else: return False return i == len(name)它给我们显示执行出错,可以看一下错误详情:
它会帮我们标注出来哪里出错,出了什么错,还贴心的画了一条红线。
如果说LeetCode上面的题目是一块块金子的话,那么题解就是一个大矿山,多少次当你绞尽脑汁终于AC,准备去题解区吹牛逼的时候,迎接你的是众多大师级别的代码,你就只能高呼卧槽,我怎么没想到,然后闭关去思考那些强悍的代码是什么逻辑,顺便默默鄙视了一眼自己的。
所以,AC之后并不是就万事大吉了,还要去观摩一下题解,学习他们的思路。
好了,今天的分享就到这,拜拜。
Alex 007 认证博客专家 机器学习 NLP TensorFlow 我是 Alex 007,一个热爱计算机编程和硬件设计的小白。为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了。如果你喜欢我的文章的话,给个三连吧!