面試中的幾個題

來源:互聯網
上載者:User

昨天面試有幾個挺難的。

1 求兩個數的和的平均值

當時一想肯定不能直接返回a+b,因為這樣如果同號的話可能會溢出,所以就用以前見到過的位元運算的方法進行計算。

判斷如果ab異號直接返回a+b,此時肯定不會溢出,如果同號的話,把負數轉化成正數,在進行如下位元運算

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

位元運算肯定不會溢出,但是此時出現一個極端問題,如果有一個負數是最小的負數,那麼它的取反是什麼

肯定不會是最大的正數,因為最大的負數絕對值比最大的正數還大一,所以越界了,越界的結果就是最大的正數加一變成了最小的負數

所以這種情況需要單獨考慮

不知道還有什麼簡便方法沒有

2 如何判定一棵二叉樹為二叉排序樹

二叉排序樹的特點是左子樹都比根節點小,右子樹都比根節點大

所以想用遞迴實現,每次遞迴都用根節點和左右孩子比較,看是否滿足條件,不滿足則返回,滿足的話,對左右孩子進行遞迴。

這裡有個問題就是,這樣操作只能保證左右孩子滿足條件,但是孩子的孩子可能不滿足了,因為二叉排序樹需要左子樹所有節點都比他自己小,右子樹都要大,因此想錯了。

後來想到二叉排序樹怎麼遍曆,只需要中序遍曆就可以實現,在遍曆的過程中只要出現後面的比前面的小則退出。

拓展:如果此時要求逆向遍曆所有節點,但是中序遍曆的演算法函數不能改變了要怎麼做

提醒:可以通過改變樹的結構

只要見過的可能會容易想一點否則很難入手,利用樹的鏡像,也就是每個根節點左右子樹交換位置,就可以實現了。

3 給8個球,有一個異常,知道異常球比別的重,至少比較幾次可以知道哪個球異常。

這個比較簡單,只需要兩次,前面部落格也總結過。

拓展:這次不知道異常球是輕還是重,如何用最少的次數找出異常球,並知道輕還是重

1)拿出六個,一邊三個

如果一樣重,則剩下的兩個有問題,任意找一個正常球和那兩個進行比較,最多三次就知道結果了

如果不一樣重,假設輕的一個標記A另一個為B

A1B2, A2B1

如果相等,則要麼A3輕,要麼B3重,隨便拿一正常的和兩個鐘的一個比較,就可以知道答案了

如果小於,必定A1輕,如果大於必定B1重

這樣最多三次就可以比較出來。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.