准备
博主:大大怪先森(记得关注,下次不要迷路哦)
编程环境:vs2013
前言
每日一题,进步一点!!!!
一.最近公共祖先
题目描述
描述:
将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。
示例:
输入:
2 3
返回:
1
题目分析
结束条件:两个数的父节点相同
下图二叉树中子节点与父节点之间的关系为root = child / 2
所以如果a != b,就让其中的较大数除以2,
如此循环直到a == b 即是原来两个数的最近公共祖先
代码实现
代码如下(示例):
class LCA {
public:
int getLCA(int a, int b) {
// write code here
while(a != b)
{
if(a > b)
{
a /= 2;
}
else{
b /= 2;
}
}
return a;
}
};
二.二进制插入
题目描述
描述:
给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。
示例:
输入
1024,19,2,6
返回
1100
题目分析
二级制的运算
第一种思路:将m右移之后和1与(&)运算取出每个位数的值
然后再和第i到j位进行按位或(|)
第二种思路:直接把m左移动i位后按位或(|)
代码实现
代码如下(示例):
class BinInsert {
public:
int binInsert(int n, int m, int j, int i) {
// write code here
//return n | (m << j);
for(int k = 0;k <= i - j;k++)
{
n |= ((m >> k) & 1) << (j + k);
}
return n;
}
};
结语
希望本篇文章能给各位带来帮助,如有不足还请指正!!!
码字不易,各位大大给个收藏点赞吧!!!