请教各位一个问题,求解答:做算法题的时候需要用语言提供的函数吗?各位有什么建议?

我举个例子,比如这题,旋转数组:https://leetcode-cn.com/probl...
这里我用JavaScript语言来实现,先不看算法写的好不好,就看一下实现方式的对比。
我写的第一种解法是:
varrotate=function(nums,k){
letlen=nums.length;
for(leti=0;iletlast=nums[len-1];
//数组右移算法
for(letj=len-1;j>0;j--){
nums[j]=nums[j-1];
}
nums[0]=last;
}
};
这样的算法有个好处,就是语言移植性很好,每个语言都有for循环,算法里面也没有用语言提供的函数。
作为对比,使用语言提供的函数来写另外一种解法:
varrotate=function(nums,k){
varprev=nums.slice(0,nums.length-3);
constremain=nums.slice(nums.length-3);
//两数组连接起来
constnewArr=remain.concat(prev);
for(leti=0;inums[i]=newArr[i];
}
};
看上去使用语言提供的函数来解算法似乎比一般的写法要高级一些。
我不明白的是,咱们在做算法训练的时候,到底要不要用语言提供的函数呢?
市面上有些书名叫:《算法-xx语言实现》是不是这些书里面的算法实现都是使用语言提供的函数来写的呀?
我个人是倾向于优先使用一般的解法,把一般的解法写出来后,才会来考虑使用擅长的语言提供的函数来写一个感觉更高级的实现。
不知道各位大神是怎么思考的?求教。
慕森王
浏览 277回答 2
2回答

呼如林

用和不用内置函数,其实是表面的。算法,通常我们考虑时间复杂度、空间复杂度。本身来说,算法是脱离语言的,和语言没有任何关系的。通常设计一个算法,用内置函数,那你得明白内置函数的实现原理、复杂度等,这样才能衡量你设计的算法的复杂度。就比如一个JS里(不考虑稀疏数组的话)push函数,时间复杂度摊销O(1),unshift函数,时间复杂度O(n),这些函数可以用,但是在衡量算法优劣指标的时候,要考虑这些因素的影响,以及自己实现会不会比内置函数更优。至于移植性,在不同语言之间通常是不存在的,也是不考虑的。移植性通常是对于同一门语言在不同平台之间。

慕姐4208626

算法题的核心是锻炼你的解题思维,所以用不用语言内置函数并不是重点。并且我们在实际处理的时候,应该写出无数种能想到的算法方式,从中挑选更优的,如果更优的解法包含内置函数,那也应该选取内置函数的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript