【力扣】面試16.07:最大數值 |位運算

題目描述

編寫一個方法,找出兩個數字a和b中最大的那一個。
不得使用if-else或其他比較運算符。

算法思路

評論區有一個

((a + b) + abs(a - b)) // 2

數學上應該很容易看懂,但是貌似這用到了判斷,判斷abs(a - b)是正還是負,所以可能不是那麼符合題意。

大佬們都是用位運算,位運算好難的,而且很難理解。

class Solution:
    def maximum(self, a: int, b: int) -> int:
        k=(a-b)&(2**33)
        k=k>>33
        return k*b+a*(k^1)

1.先看return語句,如果k==0,return值爲a;如果k==1,return值爲b.也就是說,如果a>b,我應該令k=0,否則令k=1.現在的問題是如何確定k的值呢?

2.然後看第一和第二行。需要先了解int類型的存儲方式,這個網上搜得到。理解以後,繼續看:因爲a和b均爲int,也就是在[232,2321][-2^{32},2^{32}-1]的區間內,可以確定a-b在(233,2331)(-2^{33},2^{33}-1)的區間內。

2.1 如果a-b<0,那麼a-b的左起33位必爲1,因此2{33}和a-b進行一個與操作得到2{33},記錄在k中。k右移33位得到1.

2.2 否則a-b>0,那麼a-b的左起33位必爲0。此時k的值爲0.

將步驟2和步驟1聯合起來看,得到答案。

作者:QcdxCtcc
鏈接:https://leetcode-cn.com/problems/maximum-lcci/solution/pythonmeng-xin-xiang-xiang-jie-chun-cui-wei-yun-su/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章