题目描述
编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。
示例:
- 输入: a = 1, b = 2
- 输出: 2
解题思路与代码
-
我真的觉得这道题很智障,但是你先别急。
-
这道题目的意义在于让你使用一种不常见的方法来解决一个常见问题。它可以锻炼你的编程技巧和思维能力,让你在解决问题时考虑不同的方法。
方法一: 提升整形 + 移位
- 这个解法中,我们首先计算两个数之间的差值,并将其存储为一个长整型变量(long) diff。
- 然后我们右移diff 63 位,并将结果与1进行位与操作。
- 这样,当diff为正数时(即a大于b时),k的值将为0;反之,当diff为负数时(即a小于b时),k的值将为1。
- 最后,我们根据k的值计算出最大的那个数字。
具体的代码如下:
class Solution {
public:
int maximum(int a, int b) {
long diff = static_cast<long>(a) - static_cast<long>(b);
int k = (diff >> 63) & 1;
return a * (1 - k) + b * k;
}
};
复杂度分析
时间复杂度:O(1)
空间复杂度:O(1)
总结
感觉这种题有点脑筋急转弯的意思。如果你急眼了,那你就输了。
还是有点考验对底层原理的理解与应用的。可以当做一乐。