近期的一些对算法的尝试

      暂时放弃算法的深入学习了,等熟悉了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 的调用参数 
 
问题主要出现在对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 的调用参数 
这道题说是考察柯里化,柯里化的感觉太淡了,递归的感觉
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 
function containsRepeatingLetter(str) {
    var reg = /([a-zA-Z])1/;
    return reg.test(str);
}

关键是正则里要写上对之前的引用

   感觉还是需要学Java,各种算法网站上题例最多的都是用Java写的,牛客网上一些JS实现,都是错的。下面找了几篇JS算法题例,先看看吧,决定学好Java了。

1 2

原文地址:https://www.cnblogs.com/zhansu/p/6536470.html