• 近期的一些对算法的尝试


          暂时放弃算法的深入学习了,等熟悉了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

  • 相关阅读:
    oracle 同义词
    Git分支操作
    [转]Hibernate状态 (merge,attachDirty,attachClean)
    [转]对jQuery的事件绑定的一些思考
    [转]为什么用Spring来管理Hibernate?
    [转]spring注入静态bean
    ajax 请求调用问题
    Java常用开发组件介绍
    Spring @Value SpEl 知识点小记
    radio中最佳解决方案
  • 原文地址:https://www.cnblogs.com/zhansu/p/6536470.html
Copyright © 2020-2023  润新知