技术探讨: 警惕算法刷题的陷阱

107 阅读2分钟

背景

在部门分享中对算法的问题进行探讨,但是有对算法的推导过程有分歧。记录下我的看法。

在多数的刷题网站中,会存在多数的刷题讨论和题解,但是并不是所有的题解都是在演算推导的过程,还有很多是API的调用。

实际举例

题目如下图所示: 图片.png

解法一

var twoSum = function(nums, target) {
    for(let i = 0, len = nums.length;i < len;i++){
        // 因为同一元素不允许重复出现,所以从i的下一位开始遍历
        for(let j = i + 1;j < len;j++) {
            if(nums[i] + nums[j] === target) {
                return [i, j];
            }
        }
    }
    // 所有样例都是有返回结果的,这里无所谓
    return [-1, -1];
};

解法二

var twoSum = function(nums, target) {
    const map = new Map();
    for(let i = 0, len = nums.length;i < len;i++) {
        if(map.has(target - nums[i])) {
            return [map.get(target - nums[i]), i];
        }
        map.set(nums[i], i);
    }
    return [];
};

已上便是部会中实际的分享代码段,结论是方法二优于方法一,但是问题在于,解法二在进行解决问题时,进行了Map的调用,而解法一是原生的写法,这样的对比似乎就显得有失偏颇。

原因是Map方法是js引擎自带的方式,它将底层代码封装完毕后进行了调用,但是算法是

图片.png 换句话说:算法要有清晰的从a到b的过程。但是如果是API的调用,那就等同于我将方式一进行封装,如下所示:

图片.png 虽然精简了步骤但是丧失了算法的意义,算法之所以会是基石,很大一部分的原因,是因为算法在帮助我们训练拆分和解决问题的能力。同时让代码能有序的,清晰的表达自身的逻辑。 封装的完整逻辑如下所示: 图片.png

总结

在刷算法,警惕API调用法,不能认为自己把问题解决了,就完成了算法的推导,也许你写的算法和你工作中的业务代码别无二致。

关于js源码

详情参考该作者写的文章juejin.cn/post/698609… 简而言之就是:javascript没有源码,它只是定义一套标准和编程范式,由js引擎去用代码实现。