题目描述

请编写一个方法,找出两个数字中最大的那个。要求: 不得使用if-else等比较和判断运算符

给定两个int a和b,请返回较大的一个数。若两数相同则返回任意一个。

测试样例:
1,2
返回:2

方法一

常规思路: 使用Python的内置的max方法: max(a,b)

方法二

数学思路,a和b的差的绝对值是abs(a-b),将a与b的和加上差的绝对值是最大值的两倍,即:a + b + abs(a - b) = 2 * max(a,b);而a与b的和减去差的绝对值是最小值的两倍,即:a + b - abs(a - b) = 2 * min(a,b)

1
2
3
4
5
6
7
class Max:
def getMax(self, a, b):
return int((a+b+abs(a-b))/2)
a,b = 1,2
test = Max()
test.getMax(a,b)

方法三

很奇葩的思路。。。

c = (a-b) >> 31

  • a >= b时,(a-b)是正数或零,(a-b)的二进制的符号位为0,将(a-b)右移31位,高位补0,右移后结果为0。
  • a < b时,(a-b)是负数,(a-b)的二进制的符号位是1,将(a-b)右移31位,高位补1,右移后结果为-1。

可以在终端中试验一下:

1
2
3
4
5
>>> a,b = 1,2
>>> a-b>>31
-1
>>> b-a>>31
0

然后: a + c * (a - b)

  • 当 a >= b时,c = 0,则a + c * (a - b) = a,返回的是较大值a
  • 当 a < b时,c = -1,则a + c * (a - b) = b,返回的是较大值b

代码实现:

1
2
3
4
5
6
7
8
class Max:
def getMax(self, a, b):
c = (a-b)>>31
return a+c*(a-b)
a,b = 1,2
test = Max()
test.getMax(a,b)