• 【编程强训11】最近公共祖先+求最大连续bit数


    1.最近公共祖先 ->链接

    【描述】
    将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。

    【测试样例】:

    2,3

    返回:1

    【题目解析】:

    最近公共祖先表示距离两个节点最近的公共父节点,这道题考察二叉树。

    【解题思路】:

    题目所描述的满二叉树举例如下:
    在这里插入图片描述
    我们以2和7为例,寻找2、7的最近公共祖先。

    我们知道上述树中子节点与父节点之间的关系为root = child / 2,将a=2,b=7

    所以如果a != b,就让其中的较大数除以2, 如此循环直到a == b 即是原来两个数的最近公共祖先.

    比如: 2和7的最近公共祖先:7/2 = 3 —> 3/2 = 1,

    代码实现:

    class LCA {
    public:
        int getLCA(int a, int b) {
            while(a!=b)
            {
                if(a>b)
                {
                    a=a/2;
                }
                else{
                    b=b/2;
                }
            }
            return a;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.求最大连续bit数 ->链接

    【描述】
    求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1

    数据范围:数据组数:1\le t\le 5\1≤t≤5 ,1\le n\le 500000\1≤n≤500000
进阶:时间复杂度:O(logn)\O(logn) ,空间复杂度:O(1)\O(1)

    【输入描述】
    输入一个int类型数字

    【输出描述】
    输出转成二进制之后连续1的个数

    示例1

    输入: 200

    输出: 2

    说明:200的二进制表示是11001000,最多有2个连续的1。

    【题目解析】:

    这道题考察位运算

    【解题思路】:

    我们以200为例:

    首先定义count来计数连续1的个数,定义max_count来更新当前最多的连续1(两者均初始化为0)

    我们通过200的二进制和1的二进制进行按位与操作,来判断当前最低位是否为1,

    如果为1

    count++;
    max(max_count,count);
    
    • 1
    • 2

    如果不为1,停止连续1的累加,将count置为0,即count=0;

    进行一次判断之后,通过右移一位当前数来获取次低位的判断,直到右移32位之后该数变为0,停止。

    在这里插入图片描述
    代码实现:

    #include 
    //#include
    using namespace std;
    
    int main()
    {
        int n=0;
        while(cin>>n)//多次输入
        {
            int count=0;
            int max_count=0;
            
            while(n)//右移32为之后n变为0
            {
                if(n&1)
            {
                count++;
                max_count=max(max_count,count);
            }
                else{
                count=0;
                }
                n=n>>1;
            }
          cout<<max_count<<endl;  
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    – the End –

    感谢阅读!

    本文收录于专栏编程强训
    关注作者,持续阅读作者的文章,学习更多知识!
    https://blog.csdn.net/weixin_53306029?spm=1001.2014.3001.5343

    ————————————————

  • 相关阅读:
    maven pom.xml文件结构 以及 repository 优先级概述
    软考-密码学概述
    Gateway + Oauth2实现单点登录
    Paddle CrowdNet 人群密度估计
    C++STL【string】下模拟实现string
    康耐视visionpro脚本CogRectangleAffine ,CogPolygon图形限定框,边界显示(划痕缺陷案例分享)
    Vue2+SpringBoot实现数据导出到csv文件并下载
    初阶三子棋(超详解)
    APS在印刷行业的应用前景和应用效益
    Redis 安装及配置教程(Windows)【安装】
  • 原文地址:https://blog.csdn.net/weixin_53306029/article/details/126616366