每日一题 | day11(最近公共祖先 | 求最大连续bit数)

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day11(最近公共祖先 | 求最大连续bit数)相关的知识,希望对你有一定的参考价值。

选择题

1、以下函数中,和其他函数不属于一类的是____。
A fwrite
B putc
C pwrite
D putchar
E getline
F scanf

正确答案 C:pwrite属于系统调用,其他都是库函数

2、下列哪个用法哪个是错误的()
A int *a;
B extern const int array[256];
C const int &ra;
D typedef void (*FUN)();
正确答案 C:引用必须初始化

3、若PAT是一个类,则程序运行时,语句“PAT( * ad)[3];”调用PAT的构造函数的次数是( )
A 2
B 3
C 0
D 1
正确答案 C:ad是一个指向具有PAT类型的3个元素数组的指针,这里只是声明了指针,虽然指针指向的数组有三个PAT对象,但是没有实例化其中的对象,所以并没有调用构造函数

编程题

题目1
在这里插入图片描述
题解及代码思路
我们可以大概画出数的样子
在这里插入图片描述
我们可以得出,一个节点的父节点parent = child / 2,所以我们可以通过比较两个节点之间的大小,让大的结点求父节点,判断是否和另一个结点是否相同,不相同就继续比较结点大小,例如假设a = 2,b = 12

比较a和b的大小 b > a
父节点 b = b / 2 = 6
比较a和b的大小 b > a
父节点 b = b / 2 = 3
比较a和b的大小 b > a
父节点 b = b / 2 = 1
比较a和b的大小 a > b
父节点 a = a / 2 = 1
比较a和b的大小 a == b
此时a或者b就是他们的公共祖先结点
代码

class LCA {
public:
    int getLCA(int a, int b) 
    {
        while (a != b)
        {
            if (a > b)
                a /= 2;
            else
                b /=2;
        }
        return a;
    }
};

题目2
在这里插入图片描述
解题及代码思路
这道题题目容易读懂,我们顶一个用于保存最终结果的变量res,一个用于保存遍历连续为1的个数的计数器count,我们可以用输入的数字去和1相遇,如果为1则表示该数的第一位为1,如果为1计数器count就++,并判断当前的计数器是否比保存的结果大,如果大于就将结果的值替换为count。如果和1相与之后为0,则将计数器清空,表示要从新开始计数。每遍历判断一次,该数都需要向右移一位

我们举例子,输入的数字为13,count = res = 0
13的二进制为1101
1101 & 1 = 1 count++ = 1 res = 1(count > res,res就等于count)
0110 & 1 = 0 count = 0 res = 1 (count < res,res不变)
0011 & 1 = 1 count++ = 1 res = 1 (count == res,res不变)
0001 & 1 = 1 count++ = 2 res = 2 (count > res,res就等于count)
0000 遍历结束
输出res
代码:

#include <iostream>
using namespace std;
int main()
{
	int n;
	while (cin >> n)
	{
		int res = 0;
		int count = 0;
		while (n)
		{
			if (n & 1)
			{
				++count;
				res = max(res, count);
			}
			else
				count = 0;
			n = n >> 1;
		}
		cout << res << endl;
	}
	return 0;
}

以上是关于每日一题 | day11(最近公共祖先 | 求最大连续bit数)的主要内容,如果未能解决你的问题,请参考以下文章

[每日一题]: E. Tree Queries -- 最近公共祖先

leetcode每日一题:(2020-05-10):236.二叉树的最近公共祖先

leetcode每日一题:(2020-05-10):236.二叉树的最近公共祖先

LCA求最近公共祖先+vector构图Distance Queries

备战蓝桥杯 算法·每日一题(详解+多解)-- day11

BZOJ 1977 次小生成树(最近公共祖先)