面试题 16.07. 最大数值

题目链接

面试题 16.07. 最大数值 easy

题目描述

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

示例:

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

解法:位运算

  • 如果 a − b > 0 a - b > 0 ab>0,那么 a − b a-b ab的二进制位,最高位一定为 0
  • 如果 a − b < 0 a - b < 0 ab<0,那么 a − b a-b ab的二进制位,最高位一定为 1

极端情况下 a = 2147483647 , b = − 2147483648 a = 2147483647, b = -2147483648 a=2147483647,b=2147483648 a − b a - b ab 就会爆 int

所以为了方便,我们把 a , b a,b a,b都转为 long类型的。

因为 C++ 中的 << , >>都是算数左移 和 右移,是带着符号位的。

  • a − b > 0 a - b > 0 ab>0时, k = ( a − b ) > > 63 = 0 k = (a - b) >> 63 = 0 k=(ab)>>63=0
  • a − b < 0 a - b < 0 ab<0时, k = ( a − b ) > > 63 = − 1 k =(a - b) >> 63 = -1 k=(ab)>>63=1

为了便于处理,我们将 k + = 1 k += 1 k+=1。即当 a − b > 0 a - b > 0 ab>0时, k = 1 k = 1 k=1;当 a − b < 0 a - b < 0 ab<0时, k = 0 k = 0 k=0

所以最终返回的答案就是 a ∗ k + b ∗ ( k x o r 1 ) a * k + b * (k xor 1) ak+b(kxor1)

时间复杂度: O ( 1 ) O(1) O(1)

C++代码:


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值