题目1:将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。
算法思路:一颗完全二叉树(如图)我们可以看出,父亲结点=孩子结点/2。根据这个思路我们可以先求出a、b中的较大值再除以2进行比较,直到a与b相等,此时a、b的值为最小公共祖先结点。
代码如下:
public 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;
}
}
题目2:求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
输入描述:输入一个int类型数字
输出描述:输出转成二进制之后连续1的个数
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int num = in.nextInt();
int max_count=countMaxConsecutiveOnes(num);
System.out.println(max_count);
}
public static int countMaxConsecutiveOnes(int num) {
int maxCount = 0;
int count = 0;
String binary = Integer.toBinaryString(num);
for (int i = binary.length() - 1; i >= 0; i--) {
if (binary.charAt(i) == '1') {
count++;
maxCount = Math.max(maxCount, count);
} else {
count = 0; // 重置计数器
}
}
return maxCount;
}
}