昨天面試有幾個挺難的。
1 求兩個數的和的平均值
當時一想肯定不能直接返回a+b,因為這樣如果同號的話可能會溢出,所以就用以前見到過的位元運算的方法進行計算。
判斷如果ab異號直接返回a+b,此時肯定不會溢出,如果同號的話,把負數轉化成正數,在進行如下位元運算
a&b+(a^b)>>1
位元運算肯定不會溢出,但是此時出現一個極端問題,如果有一個負數是最小的負數,那麼它的取反是什麼
肯定不會是最大的正數,因為最大的負數絕對值比最大的正數還大一,所以越界了,越界的結果就是最大的正數加一變成了最小的負數
所以這種情況需要單獨考慮
不知道還有什麼簡便方法沒有
2 如何判定一棵二叉樹為二叉排序樹
二叉排序樹的特點是左子樹都比根節點小,右子樹都比根節點大
所以想用遞迴實現,每次遞迴都用根節點和左右孩子比較,看是否滿足條件,不滿足則返回,滿足的話,對左右孩子進行遞迴。
這裡有個問題就是,這樣操作只能保證左右孩子滿足條件,但是孩子的孩子可能不滿足了,因為二叉排序樹需要左子樹所有節點都比他自己小,右子樹都要大,因此想錯了。
後來想到二叉排序樹怎麼遍曆,只需要中序遍曆就可以實現,在遍曆的過程中只要出現後面的比前面的小則退出。
拓展:如果此時要求逆向遍曆所有節點,但是中序遍曆的演算法函數不能改變了要怎麼做
提醒:可以通過改變樹的結構
只要見過的可能會容易想一點否則很難入手,利用樹的鏡像,也就是每個根節點左右子樹交換位置,就可以實現了。
3 給8個球,有一個異常,知道異常球比別的重,至少比較幾次可以知道哪個球異常。
這個比較簡單,只需要兩次,前面部落格也總結過。
拓展:這次不知道異常球是輕還是重,如何用最少的次數找出異常球,並知道輕還是重
1)拿出六個,一邊三個
如果一樣重,則剩下的兩個有問題,任意找一個正常球和那兩個進行比較,最多三次就知道結果了
如果不一樣重,假設輕的一個標記A另一個為B
A1B2, A2B1
如果相等,則要麼A3輕,要麼B3重,隨便拿一正常的和兩個鐘的一個比較,就可以知道答案了
如果小於,必定A1輕,如果大於必定B1重
這樣最多三次就可以比較出來。