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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值