面试记录

【1】不用乘法和除法操作符(*、/),实现两个整数的相除

思路:转换为减法操作,简单举例5/2,找到2的小于5的最大倍数4=2*2,5-4=1;1<2,结束,故结果为2。求取倍数可以使用位操作,每次左移等价扩大2倍。

int myDiv_2(unsigned int a,unsigned int b){
    unsigned int x,y;
    int ans=0;
    while(a=b){
        x=b;
        y=1;
        while(a=(x1)){
            x=1;
            y=1;
        }
        a-=x;
        ans+=y;
    }
    return ans;
}

【2】一个二叉树,指定其中两个节点,找出他们两个最近的祖先节点

思路1:

获得这颗二叉树的前序序列数组、中序序列数组(内部存节点id或节点指针都行),假设每个节点用id标示

前序数组A,中序B。i=0,j=0;

(1)取A的第一个节点id,i=0,此节点应为当前根节点,在B中搜素此节点,位置j,此节点将B分为左右两部分(即左右两个子树),同时记录左边元素的个数left_n,同时查询左半部分出现两个指定节点的次数。

(2)   若指定的两个节点分别分布在左右两边,则当前的根节点即为最近祖先节点。

(3)如两个节点都在左半边,则都在左子树,i=i+1,B的处理范围改为左半部分,执行(1)

(4)如两个节点都在右半边,则都在右子树,如左边元素个数n==0;则i=i+1,即为又子树根节点;否则i=i+2,即为又子树根节点,B的处理范围改为当前范围的右半部分,

       执行(1)。


思路2:采用非递归的后序遍历,借助栈,当当前遍历节点为指定节点时,保存当前栈的内容(即从根节点到本节点的路径),然后找到两个节点路经中最后一个不相同的节点,即为最近的祖先节点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值