每日一题day05

准备

博主:大大怪先森(记得关注,下次不要迷路哦)
编程环境:vs2013
在这里插入图片描述


前言

每日一题,进步一点!!!!

在这里插入图片描述


一.最近公共祖先

题目描述

描述:

将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。

示例:

输入:
 2 3
返回:
1

oj链接:
https://www.nowcoder.com/questionTerminal/70e00e490b454006976c1fdf47f155d9?

题目分析

结束条件:两个数的父节点相同
下图二叉树中子节点与父节点之间的关系为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

oj链接:
https://www.nowcoder.com/questionTerminal/30c1674ad5694b3f8f0bc2de6f005490

题目分析

二级制的运算
第一种思路:将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;
    }
};

结语

希望本篇文章能给各位带来帮助,如有不足还请指正!!!
码字不易,各位大大给个收藏点赞吧!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值