记录~
1、题目描述
查找两个节点的最近的一个共同父节点,可以包括节点自身
输入描述:
oNode1 和 oNode2 在同一文档中,且不会为相同的节点
解析:题目中说两个节点最近的一个共同父节点,可以包含这两个节点自身,也就是说,这两个节点可以是彼此的父节点,甚至有可能是相等的,因此可以这样做:先判断二者是否相互包含,如果不包含,再去找到彼此的父级节点比较,其中(如果不包含,再去找到彼此的父级节点比较)可以使用递归。
为什么可以使用递归:此处需要做的内容和上面的一样,都需要进行比较判断,也就是与上面重复,递归是最优的选择。
function commonParentNode(oNode1, oNode2) {
if(oNode1==oNode2){
return oNode1;
}
if(oNode1.contains(oNode2)){
return oNode1;
}else if(oNode2.contains(oNode1)){
return oNode2;
}else{
return commonParentNode(oNode1.parentNode,oNode2.parentNode);
}
}
注意:以上代码在线newcoder可以实现,在本地编辑器不能用
其中contains方法用于判断指定元素内是否包含另一个元素。即判断另一个DOM元素是否是指定DOM元素的后代。来自jQuery,配合jQuery才能使用 。
contains还可以使用 .hasChildNodes(节点2)
2、题目描述
根据包名,在指定空间中创建对象
输入描述:namespace({a: {test: 1, b: 2}}, ‘a.b.c.d’)输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
解析:namespace有2部分组成,前面是一个对象,后面是一个字符串,使用 . 连接,是一种包含关系。在输出描述部分,是一种对象的嵌套关系,可以看出,如果在输入时,他就是一个对象而且他的值也是对象,则不做改变,否则创建对象,赋值为{}
function namespace(oNamespace, sPackage) {
//先分割字符串
var pack=sPackage.split('.');
var pointer=oNamespace;
for(i=0,j=pack.length; i<j; i++){
if(!pointer[pack[i]] || typeof (pointer[pack[i]])!=='object'){
pointer[pack[i]]={}; //不是对象则使用对象覆盖
}
pointer=pointer[pack[i]]; //是对象则重新定位引用
}
return oNamespace;
}
3、题目描述
用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等
//递归
if(n<=2){
return 1;
}
return fibonacci(n-1)+fibonacci(n-2);
//采用原始方法,时间复杂度低,空间复杂度也低
if(n<=2){
return 1;
}
var a=1,b=1,sum=0;
for(i=3;i<=n;i++){
sum=a+b;
a=b;
b=sum;
}
return sum;
4、题目描述
统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
- 不限制 key 的顺序
- 输入的字符串参数不会为空
- 忽略空白字符
//遍历字符串str,判断每个元素在对象种是否存在,存在则++,
var obj={};
for(var i=0; i<str.length; i++){
if(str[i]){
if(obj[str[i]]){
obj[str[i]]+=1; //存在则value值=1
}else{
obj[str[i]]=1; //不存在则加入obj中,同时value值为1
}
}
}
return obj;
最后两道题目很简单,前面2道题目代码简单,但我理解起来有点困难,总之还是基础不牢啊,还需加油