刷力扣题想要做到 Bug Free 需培养怎样的思维?
首先,刷题、写代码想要快速入门并达到 Bug Free 的水平是几乎不可能的,只有勤练习,才可以逐渐全面自己思考问题的角度,减少编写代码时候的漏洞。而在炼成 Bug Free 的漫漫长路上,又有两重坎:写无 Bug 的代码和周全的算法。
当然,想要达到这两重砍的训练方法和我们平时在力扣由浅入深学习算法题的训练是一致的。
总的思路可分为几个步骤,第一步先练好写基本代码的能力,做到想实现什么功能就能不假思索地码出简洁的代码来、指哪打哪、快准稳狠。
接着后续再提升自己思维能力和考虑问题的周全性,同时积累一定的做题经验,面对题目时要能快速发现坑点,有能力构造一些特殊数据,测试自己程序的健壮性。
具体来说,写出没 Bug 的代码,其实秘籍只有两个字:练习。但光如此还不够,可能会忽略一些关键问题。
想要快速提升编写代码的能力,你需要注意力扣君提示的下面几点。
如果反复思索多次,还不明白关键信息,那可以通过画图或者手动几组数据测试的方法进行摸索。在此过程中,你觉得哪里才是容易出错的地方?
这就得靠我们平时写代码时需多踩坑,多积累。
正如一些同学所说,发现每次遇到 For 循环操作 String 的时候,总会出现一些边界问题。这其实就是对容易出错地方的一种总结,下次再写到的时候多注意就不会出 Bug 了。
学习优质的写法慢慢形成自己的风格。举个例子,比如刚开始写二分时,很多人都会左开右闭、左闭右开分不清。倒不如先学习一个简单的记录答案写法,保证自己遇到这类问题肯定能写对,然后随着刷题量的增加慢慢领悟其他写法。这也算是一种先借鉴,后续通过自己能力的自然提升,了解到其中的道理。
int left=1, right=Inf, ans=Inf;
while(left<=right){
int mid=(left+right)/2;
if (check(mid)){
ans=min(ans, mid);
right=mid-1;
}else left=mid+1;
}
可能是影视作品看多了,总感觉代码写的越炫越牛叉,但在现实中并非如此。
自己写的代码,将来可能是给未来的自己、比赛队友或者工作同事看的,为了不找麻烦,尽可能的写简单明了一点。比如:勤用临时变量,函数名、变量名赋予些意义,逻辑运算、位运算、代数运算混在一起的地方多用几个括号标明运算顺序等等。
总之,就是让下一个阅读这段代码的人更容易理解它,不用对着某一处代码发呆很久还不理解意义,这些方法也能让自己在检查代码过程中更加顺利。
自检的过程非常重要,写完整段代码或者功能块之后,做到立即查阅,检查一些有明显逻辑错误或者代码笔误的地方,将低级错误扼杀在摇篮里。
另一方面就是算法了,写代码之前,保证算法的正确性尤为重要。想想看,如果自己写了半天代码,结果发现实现的一个假算法,我想你应该会崩溃。那么如何杜绝假算法呢?力扣君再教大家几招。
正确理解题意
做题的过程中,总会遇到一些意思含糊的题目,导致我们第一遍阅读时理解错了题意。如果此时立刻开始想题、写代码,可能到了测试题目样例的环节才会发现自己对题意理解有些许偏差。
浪费了很多时间不说,还凭空给自己添加负面的情绪。比较推荐的做法是,先读题,接着通过手算样例理解一遍题意,这样不仅能二次确认,也可对之后的想题环节提供帮助。
想好了再敲,构造边界数据测试程序
对于某个题目,如果有了一些思路,一定要将这个思路理清楚,细节讨论明白。绝对不能先写,再等实现了去想细节,一些节点没想清楚的地方,都是将来可能导致 Bug 的隐患所在。确认了一个完整算法之后,也要手动造一些特殊数据来测试它的正确性。
代码复杂且难写,可能是算法不够完美
有两种情况,写的很快但可读性差,这种应该叫做码农。但简单的代码,写的时间很长,那么大概率是顶尖程序员。
之前有个同学与力扣君分享,在阿里实习期间,曾经看到过两位 P8 为了一段几十行的代码,讨论了一个下午,当时以为是很难的代码,后面去观摩了之后发现,就是简单的查询代码。
写在最后
希望这篇文章对正在刷题的初学者们有所启发,祝大家早日成为无 Bug Free 的程序员~。
BY /
本文作者:力扣
编辑&版式:Janson
声明:本文归“力扣”版权所有,如需转载请联系。
点个在看,少个 bug
微信扫码关注该文公众号作者