面试中的几个题

昨天面试有几个挺难的。

1 求两个数的和的平均值

当时一想肯定不能直接返回a+b,因为这样如果同号的话可能会溢出,所以就用以前见到过的位运算的方法进行计算。

判断如果ab异号直接返回a+b,此时肯定不会溢出,如果同号的话,把负数转化成正数,在进行如下位运算

a&b+(a^b)>>1

位运算肯定不会溢出,但是此时出现一个极端问题,如果有一个负数是最小的负数,那么它的取反是什么

肯定不会是最大的正数,因为最大的负数绝对值比最大的正数还大一,所以越界了,越界的结果就是最大的正数加一变成了最小的负数

所以这种情况需要单独考虑

不知道还有什么简便方法没有

2 如何判定一棵二叉树为二叉排序树

二叉排序树的特点是左子树都比根节点小,右子树都比根节点大

所以想用递归实现,每次递归都用根节点和左右孩子比较,看是否满足条件,不满足则返回,满足的话,对左右孩子进行递归。

这里有个问题就是,这样操作只能保证左右孩子满足条件,但是孩子的孩子可能不满足了,因为二叉排序树需要左子树所有节点都比他自己小,右子树都要大,因此想错了。

后来想到二叉排序树怎么遍历,只需要中序遍历就可以实现,在遍历的过程中只要出现后面的比前面的小则退出。

拓展:如果此时要求逆向遍历所有节点,但是中序遍历的算法函数不能改变了要怎么做

提醒:可以通过改变树的结构

只要见过的可能会容易想一点否则很难入手,利用树的镜像,也就是每个根节点左右子树交换位置,就可以实现了。

3 给8个球,有一个异常,知道异常球比别的重,至少比较几次可以知道哪个球异常。

这个比较简单,只需要两次,前面博客也总结过。

拓展:这次不知道异常球是轻还是重,如何用最少的次数找出异常球,并知道轻还是重

1)拿出六个,一边三个

如果一样重,则剩下的两个有问题,任意找一个正常球和那两个进行比较,最多三次就知道结果了

如果不一样重,假设轻的一个标记A另一个为B

A1B2, A2B1

如果相等,则要么A3轻,要么B3重,随便拿一正常的和两个钟的一个比较,就可以知道答案了

如果小于,必定A1轻,如果大于必定B1重

这样最多三次就可以比较出来。

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值