LeetCode最大数值

LeetCode最大数值

题意

编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。

示例:

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

解析

可以很简单的取巧直接使用Math.max(a,b)来解决。但是,内部实质还是用到if-else来处理。

转换下思路,求最大值可以用如下公示:

int sum = a + b;
int abs = abs(a - b);
int result = (sum + abs) / 2; 

这题真正考察的应该是使用位运算来处理绝对值
可以套用如下公式:
shift表示位数 int -> shift = 8,依次类推。
(a ^ (a >> shift))-( a >> shift)

推论

  • a >= 0
    a^(a>>8) = a
    (a ^ (a >> shift))-( a >> shift) => (a^0X00) - 0X00 => a
  • a < 0
    a^(a>>8) = a ^ (0XFF)
    (a ^ (a >> shift))-( a >> shift) => (a^0XFF) - 0XFF=> -a
代码

有一点需要注意是的,需要转换成long类型运算,因为 加操作容易溢出。
Integer.MAX以及Integer.MIN是边界值,会出现溢出

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

你可能感兴趣的:(Leetcode)