【算法】牛客网前端算法(20-30)
1.
//将数组 arr 中的元素作为调用函数 fn 的参数 function argsAsArray(fn, arr) { return fn.apply(this,arr); }
2.
//将函数 fn 的执行上下文改为 obj 对象 function speak(fn, obj) { return fn.call(obj); }
3
//实现函数 functionFunction,调用之后满足如下条件: //1、返回值为一个函数 f //2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 , //3、所有函数的参数数量为 1,且均为 String 类型
function functionFunction(str) { return f=function(s){ return str+, +s; }; }
4.使用闭包
//实现函数 makeClosures,调用之后满足如下条件: //1、返回一个函数数组 result,长度与 arr 相同 //2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同
//评论中很好的总结了闭包问题https://www.nowcoder.com/questionTerminal/578026cd24e3446bbf27fe565473dc26
/*常犯错误
function makeClosures(arr, fn) { var result=[]; for(var i=0;i<arr.length;i++){ result[i]=function(){ return fn(arr[i]); }; } return result; }
*/
function makeClosures(arr, fn) { var result=[]; for(var i=0;i<arr.length;i++){ result[i]=function(num){ return function(){ return fn(num); }; }(arr[i]); } return result; }
5.
//已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件: //1、返回一个函数 result,该函数接受一个参数 //2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致 function partial(fn, str1, str2) { return f=function(str3){ return fn(str1,str2,str3); } }
6.
//函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换。 function useArguments() { var sum=0; for(var i=0;i<arguments.length;i++){ sum+=arguments[i]; } return sum; }
7.
//实现函数 callIt,调用之后满足如下条件 //1、返回的结果为调用 fn 之后的结果 //2、fn 的调用参数为 callIt 的第一个参数之后的全部参数 function callIt(fn) { var arg=Array.prototype.slice.call(arguments,1); var res=fn.apply(this,arg); //不能直接使用fn(arg),因为fn中的参数为具体的参数,非一个数组 return res; }
8.
//实现函数 partialUsingArguments,调用之后满足如下条件: //1、返回一个函数 result //2、调用 result 之后,返回的结果与调用函数 fn 的结果一致 //3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数 function partialUsingArguments(fn) { var a=Array.prototype.slice.call(arguments,1); var result=function(){ var b=Array.prototype.slice.call(arguments); return fn.apply(this,a.concat(b)); } return result; }
9.
//已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件: //1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数) //2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1 //3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1 //4、调用 c 之后,返回的结果与调用 fn 的返回值一致 //5、fn 的参数依次为函数 a, b, c 的调用参数 function curryIt(fn) { return a=function(str1){ return b=function(str2){ return c=function(str3){ return fn(str1,str2,str3); } } } }
10.
//返回参数 a 和 b 的逻辑或运算结果 function or(a, b) { return a||b; }