暂时放弃算法的深入学习了,等熟悉了Java再搞算法。
先从牛客网的JS方面刷起,接着刷数据结构和算法,然后去刷leetcode,这儿记载自己从出错的地方。
对于leedcode,写个个人使用指南。
下面几个是用js做的题的链接
1 2 3 4 5 基本上这几个就够了,看不懂解题过程就去牛客网看看别人的分析过程,虽然是别的语言写的,但思想是不变的。
1.题目描述
移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 。
没有认真思考,写下了如下的答案
function removeWithoutCopy(arr, item) { for(i = 0; i < arr.length; i++) { if( arr[i] === item) { arr.splice(i,1); } } return arr; }
然后提交不让通过,哪里出问题了呢?嗯,在splice后,不应该使用i++到下一个元素位置上,因为该处的元素删除了,所以还应该在该处的i上进行下一次判断。正确写法如下
function removeWithoutCopy(arr, item) { for(i = 0; i < arr.length; ) { if( arr[i] === item) { arr.splice(i,1); } else { i++; } } return arr; }
2.题目描述
找出数组 arr 中重复出现过的元素
function duplicates(arr) { var a = arr.sort(), b = []; for (var i = 0; i < arr.length - 1; i++) { if (a[i] === a[i + 1] && b.indexOf(a[i]) == -1) { b.push(a[i]); } } return b; }
3.题目描述
实现函数 partialUsingArguments,调用之后满足如下条件:
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
问题主要出现在对bind理解出了偏差,以前写的一篇博客引用的问题,错误的答案如下
function add(fn) { var arr = [].slice.call(arguments, 1) return fn.bind(this, arr); } var a = 1; var b = 2; var c = 3; var d = 4; var test = function (first, second, third, forth) {return first + second + third + forth;}; console.log(add(test, a, b)(c, d));
嗯,在fn.bind(this, arr)中不能用arr,应改为arr[0],arr[1],那这道题更严谨的做法应该是返回一个自定义函数,该函数里使用apply与concat方法模拟出适用性更强的bind,由此可见,必须熟练掌握bind的实现,以应对各种情况。
function add(fn) { var arr = [].slice.call(arguments, 1) return function () { return fn.apply(null, arr.concat([].slice.call(arguments, 0))) } }
4.题目描述
已知 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 的调用参数
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) { var length = fn.length, args = []; var result = function (arg) { args.push(arg); length--; if (length <=0 ) { return fn.apply(this, args); } else { return result; } } return result; }
5.题目描述
给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false