每日一题 | 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.二叉树的最近公共祖先