牛客前端入门篇题目

本文探讨了JavaScript中的三个实用主题:通过递归查找两个节点的最近公共父节点,如何在命名空间中创建嵌套对象,以及使用两种方法实现斐波那契数列。这些基础但重要的编程技巧对于提升开发者技能至关重要。
摘要由CSDN通过智能技术生成

记录~

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 为出现频率

  1. 不限制 key 的顺序
  2. 输入的字符串参数不会为空
  3. 忽略空白字符
 //遍历字符串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道题目代码简单,但我理解起来有点困难,总之还是基础不牢啊,还需加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值