背景
在部门分享中对算法的问题进行探讨,但是有对算法的推导过程有分歧。记录下我的看法。
在多数的刷题网站中,会存在多数的刷题讨论和题解,但是并不是所有的题解都是在演算推导的过程,还有很多是API的调用。
实际举例
题目如下图所示:
解法一
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引擎自带的方式,它将底层代码封装完毕后进行了调用,但是算法是
换句话说:算法要有清晰的从a到b的过程。但是如果是API的调用,那就等同于我将方式一进行封装,如下所示:
虽然精简了步骤但是丧失了算法的意义,算法之所以会是基石,很大一部分的原因,是因为算法在帮助我们训练拆分和解决问题的能力。同时让代码能有序的,清晰的表达自身的逻辑。
封装的完整逻辑如下所示:
总结
在刷算法,警惕API调用法,不能认为自己把问题解决了,就完成了算法的推导,也许你写的算法和你工作中的业务代码别无二致。
关于js源码
详情参考该作者写的文章juejin.cn/post/698609… 简而言之就是:javascript没有源码,它只是定义一套标准和编程范式,由js引擎去用代码实现。