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);
}
}