最近开始看LeetCode。发现里面的题目还是很丰富的。各种难度都有。而且对于具体的题目有官方的解答,也有用户的解答。很有参考价值。我觉得最有收获的方式是:自己根据题目写一遍,之后看官方答案以及用户答案,最后对比自己的解答。
对于编程而言,应用软件实际是系统,而LeetCode上面的算法函数题实际上就是组成系统的各个部分。不同的系统对组成部分给出的边界条件是不同的。所以LeetCode上面的问题想要直接应用到系统之中,可能效果并不好。所以最好能够分析一下这种算法题背后的意义。
比如:判断一个整数是否是回文数。这个题目本身是非常经典的计算机算法题目。但是在日常的程序编写过程中极少会碰到。我们做的日常数据处理并没有判断一个数是否是回文数的需求。那么这个算法题的来源是什么呢?通过度娘,我了解到,原来回文数最开始是被一群对数字感兴趣的数学家关注的。他们喜欢这种特殊的数字,而且发现了一个有趣的回文数算法猜想。
即:给定任意整数,通过不断的翻转相加,最终能够得到一个回文数。
其中196似乎目前还没有找到能够得到回文数的步数。
所以,回文数判断的算法中,无论是通过十进制求余数遍历每一个数字位,还是对一半的数字进行比较提前终止计算,都是对当前这个问题的一个特殊优化。这种处理方式本身没有过多的价值,除非能够找到更加通用的地方,比如:让回文数判断本身更加流行。否则这种优化也是属于屠龙之术。
计算机算法永远存在优化问题。无论是空间还是时间。每一个具体的优化都是根据具体场景进行处理的。在限制条件之内进行优化。比如:开平方计算在以前的3D游戏中是很重要的函数,使用的地方非常多。但是由于当时计算能力有限,所以需要对开方计算进行优化,使用了一些快速的替代性方法进行计算。其中引入了一些magic number拟合一个有限区间内的开方计算结果,从而在降低准确率的基础上提高速度。
所以对于LeetCode的问题实际并不需要过于追求效率。一切首先以实现为第一目的,之后才是提高效率。而提高效率本身一定与当前题目的约束条件有关。对于约束条件的具体优化的部分,可以提炼出来一些共性,作为自己之后阅读代码和编写代码的知识储备。
网友评论