这是一个很有意思的问题,首先要理解什么是技巧。
什么是技巧
我举一个数学中的例子,比如:
a=(a+b)/2+(a-b)/2
b=(a+b)/2-(a-b)/2
这就是数学技巧。
你可能会问,这什么鬼?是的,技巧如果脱离了特定问题,那么它就没有意义。
所以没有哪本课本或者哪篇文档会专门讲技巧,也没有哪个老师会专门教技巧。技巧只有自己在实践中领悟,才能学会。
比如你碰到一道数学三角函数证明题,
sin(a)+sin(b)=2sin((a+b)/2)cos((a-b)/2)
完全不会吧?
看下答案:
变换,
sin(a)=sin((a+b)/2+(a-b)/2)
然后展开,
sin(a)=sin((a+b)/2)cos((a-b)/2)+cos((a+b)/2)sin((a-b)/2)
同样,sin(b)也是先变换,后展开,
sin(b)=sin((a+b)/2-(a-b)/2)=sin((a+b)/2)cos((a-b)/2)-cos((a+b/2)sin((a-b)/2)
最后,两边相加就行了。
那么这道题一开始到底是哪里不会呢?是三角函数不会展开?还是两个等式两边相加想不到?
都不是,恰恰是第一步的技巧变换想不到,能想到这个变换的话,后面的过程就是顺理成章的事情。
这就是技巧的应用。
编程技巧
在编程领域也有类似的技巧。
比如我们在写二分查找的时候,有一步是找到左边界和右边界的中间,很多人会这样写
mid=(low+high)/2
但是如果数据量大,low+high可能溢出,导致程序出错,如果写成
mid=(high-low)/2+low
就不会有这个问题。
这其实就是一个编程技巧,我刚毕业那会儿,曾经在一次面试中手写二分查找用到了这个技巧,被面试官指出并加以赞许。
所以同样是二分查找,这个细节的技巧处理,就让你在茫茫人海中脱颖而出。
类似的技巧还有很多,比如哨兵,比如设计模式等等。
其实在学校学设计模式也是很有感触,很多模式当时看懂了,但是因为没有实践或者没有场景,很快就会忘光。
设计模式也是一种技巧,技巧这种东西,你如果不理解它怎么运用,光记是记不住的,即使记住了也没啥用,很快就会忘。
怎么提高编程技巧
提高编程技巧没有捷径,就是平时多练习,多实践,但是要注意,实践的时候,要留意那些技巧,特意去体会,然后拿来为自己所用,这才能学会一个技巧。
很多人刷leetcode,刷完之后,编程水平并没有很大提高,为什么呢?
比如同样是一个二维数组的四方向搜索,你可能写了四个if去判断,没问题,能过。但是其他人可能是定义了一个方向数组,然后把搜索逻辑统一了,一个if都不用,代码即简洁又不易出错。
这其实就是技巧,你如果不去注意,可能一辈子都学不到。
你刷了300道题,都过了,但是你用的可能并不是最好的算法,写的也不是最简洁的代码,所以时间花出去了,收益却不高。
学编程还是要重视一些常用的技巧,很多时候,这就是你不加班的秘密武器。
大家还知道哪些编程技巧?欢迎留言进行分享。