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
网友评论