《程序员面试金典(第6版)》面试题 16.07. 最大数值(移位 + 整形提升)

题目描述

编写一个方法,找出两个数字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)

总结

感觉这种题有点脑筋急转弯的意思。如果你急眼了,那你就输了。

还是有点考验对底层原理的理解与应用的。可以当做一乐。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宋同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值