OJ编程
-
1、最近公共祖先
有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1。现在有两个结点a,b。请设计一个算法,求出a和b点的最近公共祖先的编号。
给定两个int a,b。为给定结点的编号。请返回a和b的最近公共祖先的编号。注意这里结点本身也可认为是其祖先。
解:画个图先:假设现在是 7 个结点。
这是个满二叉树,其结点按根结点一层一层地从左往右依次编号。而我们知道左子树和右子树于其父结点的关系如下:
left_ = parent_ * 2
right_ = parent_ * 2 + 1
所以
parent_ = left_/2
parent_ = right/2
这样找父结点就简单了。每次对比两个结点,谁大就把谁除以 2。直到两个结点相等。
如: 2 7
7 > 2 -------> 7 /= 2 (int型,故向下取整)
3 > 2 -------> 3 /= 2
1 < 2 -------> 2 /= 2
1 = 1 -------> 结束
-
2、、最大连续bit数
功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
解:又是一个位运算的题。用一个max变量记录最大连续数,用一个cur记录当前的连续1的个数,如果max < cur则更新max。将这个byte数字每次向右移一位,直到为 0 。
-
3、源代码地址
戳标题参考源代码