美文网首页
js前端面试题(每日两道1)

js前端面试题(每日两道1)

作者: 张凯斯 | 来源:发表于2018-02-24 16:06 被阅读0次

    1.解析字串

    完成一个 extractStr 函数,可以把一个字符串中所有的 : 到 . 的子串解析出来并且存放到一个数组当中,例如:

    extractStr('My name is:Jerry. My age is:12.')// => ['Jerry', '12']

    注意,: 和 . 之间不包含 : 和 .。也即是说,如果 ::abc..,则返回 ['abc']。

    答案:

    function extractStr(str){

        // string.match(regexp)通过正则将匹配的字符串找出,通过数组形式返回

        let arr=str.match(/:[^:\.]*\./g)//  [':Jerry.', ':12.']

        // Array. map ( Array ) 通过原生js的map方法将数组传入 (这里用到了箭头函数,相当于arr.map(function(arrStr){return arrStr.replace(/[:\.]/g,'')})),传入的数组会自动遍历成字符串

        //字符串通过 String.replace( regexp ,str) 这个原生js方法的正则将:和. 替换为空(‘’)

        //最后map通过数组形式返回替换后的字符串

        return arr.map(

            (arrStr)=>arrStr.replace(/[:\.]/g,'')

        )

    }

    extractStr('My name is:Jerry. My age is:12.')//  ['Jerry', '12']

    2.记忆化斐波那契函数(Memoization)

    fibonacci (n)=fibonacci (n-2)+fibonacci (n-1)

    1,1,2,3,5,8,13,21

    解释:

    斐波那契函数递归 fibonacci (7)时。做了这样的操作

    fibonacci (7)=fibonacci (5)+fibonacci (6)

    fibonacci (6)=fibonacci (4)+fibonacci (5)

    fibonacci (5)=fibonacci (3)+fibonacci (4)

    fibonacci (4)=fibonacci (2)+fibonacci (3)

    fibonacci (3)=fibonacci (1)+fibonacci (2)

    fibonacci (2)=fibonacci (0)+fibonacci (1) 

    这些函数先存储起来,直到得到fibonacci (0)=0, fibonacci (1)=1时。才从下向上返

    但是我们发现 递归计算的中间过程被存储到了栈里。这样不仅占用了太大的内存,而且重复存储了一倍的内容(加粗部分)。

    所以我们用到了 Memoization 记忆化,我们把要存储的做判断放在对象中(堆),通过引用的方法来调用。这样大大的加快了程序运行速度。

    答案:

    var fibonacci = (function () {

    //为什么用对象缓存,而非数组。例如我们调用fibonacci(100),这时候,fibonacci函数在第一次计算的时候会设置memory[100]=xxx,此时数组长度为101,而前面100项会初始化为undefined。正因为如此,memory的类型为数组的时候比类型是对象的时候慢。

        var memory = {} 

        return function(n) {

            if(n==0 || n == 1) {

                return n

            }

            if(memory[n-2] === undefined) {

                memory[n-2] = fibonacci(n-2)

            }

            if(memory[n-1] === undefined) {

                memory[n-1] = fibonacci(n-1)

            }

            return memory[n] = memory[n-1] + memory[n-2]

        }

    })()

    参考:https://segmentfault.com/a/1190000007115162

    相关文章

      网友评论

          本文标题:js前端面试题(每日两道1)

          本文链接:https://www.haomeiwen.com/subject/lqrqxftx.html