leetcode 面試題 16.07. 最大數值(待深究)

【題目】面試題 16.07. 最大數值

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

示例:

輸入: a = 1, b = 2
輸出: 2

【解題思路1】位運算實現絕對值功能

本質是平均值法: max(a, b) = ((a + b) + abs(a - b)) / 2
在這裏插入圖片描述

class Solution {
    public int maximum(int a, int b) {
        long sum = (long)a + (long)b;
        long diff = (long)a - (long)b;
        long abs_diff = (diff ^ (diff >> 63)) - (diff >> 63);
        long res = (sum + abs_diff) / 2;
        return (int)res;
    }
}

【解題思路2】計算a-b的符號

正數最高爲0,負數最高爲1。排除a-b超Integer範圍情況,強轉long

class Solution {
    public int maximum(int a, int b) {
        int i = (int) (((long) a - (long) b) >>> 63);
        return (i ^ 1) * a + i * b;
    }
}

同號相減永不溢出,異號相比無腦選正。

class Solution {
    public int maximum(int a, int b) {
        // 先考慮沒有溢出時的情況,計算 b - a 的最高位,依照題目所給提示 k = 1 時 a > b,即 b - a 爲負
        int k = b - a >>> 31;
        // 再考慮 a b 異號的情況,此時無腦選是正號的數字
        int aSign = a >>> 31, bSign = b >>> 31;
        // diff = 0 時同號,diff = 1 時異號
        int diff = aSign ^ bSign;
        // 在異號,即 diff = 1 時,使之前算出的 k 無效,只考慮兩個數字的正負關係
        k = k & (diff ^ 1) | bSign & diff;
        return a * k + b * (k ^ 1);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章