每日一题-20240120

题目描述

面试题 16.07. 最大数值

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

示例:

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

解题思路

  1. 首先 a - b 得到差值x

  2. 由于是long型,右移63位得到符号位,注意负号不变,那么正数右移63位就是0,负数右移63位就是-1

  3. 那么得出我们的计算公式 (1 + k) * a - b * k
    当 x >= 0 的时候,k = 0, 即 a > b
    那么我们的计算公式为 1 * a - b * 0 = a

    当 x < 0的时候,k = -1, 即 b > a
    那么我们的计算公式为 0 * a - b * ( -1 ) = b

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Solution1607 {
/**
* 首先 a - b 得到差值x
* 由于是long型,右移63位得到符号位,注意负号不变,那么正数右移63位就是0,负数右移63位就是-1
* 那么得出我们的计算公式 (1 + k) * a - b * k
* 当 x >= 0 的时候,k = 0, 即 a > b
* 那么我们的计算公式为 1 * a - b * 0 = a
* 当 x < 0的时候,k = -1, 即 b > a
* 那么我们的计算公式为 0 * a - b * ( -1 ) = b
*
* @param a
* @param b
* @return int
* @author Forest Dong
* @date 2024/01/23 19:30
*/
public static int maximum(int a, int b) {
long x = a - b;
int k = (int) x >> 63;
return (1 + k) * a - k * b;
}

public static void main(String[] args) {
System.err.println(maximum(-9, 20));
}
}