腾讯笔试编程题之满树中任意三个节点的公共祖先问题

#include <iostream>
using namespace std;

int main()
{
    int K;
    cin>>K;
    int a,b,c;
    cin>>a>>b>>c;

    //将输入的三个节点排序
    int temp;
    if(a>b)temp=a,a=b,b=temp;
    if(a>c)temp=a,a=c,c=temp;
    if(b>c)temp=b,b=c,c=temp;

    int root=1<<(K-1);//根节点的值
    int root_a=1,t_a=1;//a和b的公共祖先root_a
    int root_b=1,t_b=1;//b和c的公共祖先root_b
    int rest=1,result=1;//root_a和root_b的公共祖先result

    for(int i=a;i<=b;i++)
    {
        int t=root;
        while(i%t!=0)t=t>>1;
        if(t>t_a)t_a=t,root_a=i;
    }
    for(int i=b;i<=c;i++)
    {
        int t=root;
        while(i%t!=0)t=t>>1;
        if(t>t_b)t_b=t,root_b=i;
    }
    for(int i=root_a;i<=root_b;i++)
    {
        int t=root;
        while(i%t!=0)t=t>>1;
        if(t>rest)rest=t,result=i;
    }
    cout<<result;
    return 0;
} 
笔试的时候还专门写了一个树类,实现了一个树构造函数。。。笔试都快结束时才发现根本不用这么麻烦。
这个方法主要思想就是找a、b之间,b、c之间能整除最大的2的次幂的两个数root_a,root_b,
然后求出root_a,root_b 之间能整除最大的2的次幂的数result便是最终结果。
三个查找过程当然也可以写个函数,减少冗余代码。
全部评论
dfs改造,不断缩小范围,如果树的范围能涵盖就继续从左右子树搜索,这题很像leetcode里面校验这棵树是否是排序树的题目
点赞 回复 分享
发布于 2017-04-05 14:06
二分查找就够了
点赞 回复 分享
发布于 2017-04-05 11:08
根据树的性质来解,不用建树:
点赞 回复 分享
发布于 2017-04-05 10:36
能给个大致的思路不?我也是建了二叉排序树。。。。谢谢
点赞 回复 分享
发布于 2017-04-05 10:17

相关推荐

Hakasee:我的简历和你的基本一样,上周去了上海,boss投了三百家, 三家线下面试 第一家没有做题,全是八股和项目,因为第一次面试不怎么熟练,挂了 第二家,给你几个题目(①css垂直居中文字,字体每两秒闪烁一下以及点击弹窗,②给你一个链接,实现可视化地图,③然后是八股,图片性能优化,以及对图片app有什么想法),45分钟内做完,然后老板面试) 第三家特别偏僻,有点阴森,到了之后让了一个工位给我,有四个题目,①格式化时间 年月日当前时间星期几② 正则表达式提取新闻文字,③在文本域输入文字生成选择题以及选项④生成商品排版还是什么来着 三家都是不超过50人的小公司 两家线上牛客笔试(卡伦特,七牛云,但是笔试不仅要考前端,还要考后端,算法,甚至数学题 我的建议是如果只做了这两个vue项目且不怎么熟练的情况下,先沉淀沉淀,把react学了,上海好的公司基本都是react查看图片
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务