面试题 16.07. 最大数值 ——一种基于乘法和位运算的解题思路

这篇具有很好参考价值的文章主要介绍了面试题 16.07. 最大数值 ——一种基于乘法和位运算的解题思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

剧透警告,没写过的勿触

题目:

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

qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq

qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq

qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq

qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq pwq qwq qwq qwq qwq qwq qwq qwq qwq qwq

qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq

先上代码:

class Solution {
    public int maximum(int a, int b) {
        int isNegative = (a / 2 - b / 2) >>> 31;
        return ((1 - isNegative) * a) + (isNegative * b);
    }
}

因为0乘任何数都是0,结果一个0一个1,就可以把乘积相加咯qwq
硬要说问题的话,小数不能使用>>> 31的方式取1(好像是8+23的原因?),比如:0.2 - 0.8 == -0.6000000000000001,解决方式的话可以使用isNegative = (isNegative * 2) | 1来变回正整数。当然,题目的数据集都是整数,而且也恰巧差值都大于1(如果遇到差值为1的样本,那就会报错了),所以* 2只是复原了这个方法/ 2的结果。

加上优化写了四个小时,尝试了四种思路:

  • 使用与、非、异或符号加位运算的数学运算思路
  • 使用try catch和0不能被除的报错
  • 使用数组和布尔值实现减法器
  • 最终方案,上面的代码

当然前两条已经尝试无果了,位运算根本无法摘取出他们的最大值差异,所以就陷入了死循环;至于try catch?开玩笑一样的方法,直接不给过= =

然后是数组和布尔的,上代码:


class Solution {
    public int maximum(int a, int b) {
        int[] res = new int[]{a, b};
        return res[(a / 2 - b / 2) >>> 31];
    }
}

也是从汇编减法器中迸发的想法,一瞬间醍醐灌顶。

然后呢,后面两个解法差不多半小时全部写完awa

后面两个代码的想法来自朋友写的一个公式,产生了火花,感谢朱静Think的帮助:

图里内容抽象出来就是:
如果|a - b| + (b - a) = 0,则说明a > b,这很重要,是扭转战局的胜负手。文章来源地址https://www.toymoban.com/news/detail-525161.html

到了这里,关于面试题 16.07. 最大数值 ——一种基于乘法和位运算的解题思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB基础操作,矩阵乘法、数组矩阵索引、最大最小运算符、零矩阵/随机矩阵/单位矩阵的生成、log函数、Inf和NaN的含义,语句过长用连接符换行、逻辑运算符以及区别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文总结MATLAB编程时的一些基本操作,适用于新手小白,主要包括矩阵相乘、生成矩阵、矩阵基本操作、数组索引、最大最小操作符。 线性代数的两个矩阵相乘:用符号 “ * ” 例如A*B得到A与B的矩阵相

    2024年02月04日
    浏览(78)
  • 数值分析——曲线拟合的最小二乘法

    拟合曲线定义:求近似函数 φ(x), 使之 “最好” 的逼近f(x) ,无需满足插值原则. 这就是曲线拟合问题。 (时间紧迫直接看例子就行,智慧交通专业的补修课,可能理论学的不那么深入,主要是方法。) 超定方程组 是指方程个数大于未知量个数的方程组 。 最小二乘解 : 对于

    2024年02月09日
    浏览(44)
  • 数值计算大作业:最小二乘法拟合(Matlab实现)

        作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业。      我把最小二乘算法在MATLAB中整合成了一个M函数文件least square fitting.m,直线拟合函数lsf_linear.m,以及抛物线拟合函数lsf_parabolic.m。程序放在文章最后了,需要的同学自取。下文为作业详

    2024年02月07日
    浏览(41)
  • 高等代数(四)-矩阵07:分块乘法的初等变换及应用举例

    § 7 § 7 §7 分块乘法的初等变换及应用举例 将分块乘法与初等变换结合是矩阵运算中极重要的手段. 现将某个单位矩阵进行如下分块: ( E m O O E n ) . left(begin{array}{cc} boldsymbol{E}_{m} boldsymbol{O} \\\\ boldsymbol{O} boldsymbol{E}_{n} end{array}right) . ( E m ​ O ​ O E n ​ ​ ) . 对它进行两行

    2024年02月22日
    浏览(40)
  • 矩阵乘法实现卷积运算

            矩阵根据卷积核的大小进行,从左到右、从上到i 下 的移动,对应数据相乘再相加得到的数据为该区域的值。 ​​​​​​​ ​​​​​​​         原理:根据对于相乘相加的机制,发现通过对卷积核填零构成和输入矩阵大小一致的矩阵,然后展平拼接起来,

    2024年02月12日
    浏览(47)
  • FPGA 移位运算与乘法

             已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)           复位信号高有效,低复位;在inpu_grant上升沿到来时,取一次d的值,并且4个时钟周期取一次;out是将inpu_grant取

    2024年01月16日
    浏览(31)
  • 大数运算(加法,减法,乘法,除法)

    目录 一.大数加法 1.题目描述 2.问题分析 3.代码实现 二.大数减法 1.题目描述 2.问题分析 3.代码实现 三.大数乘法 1.题目描述 2.问题分析 3.代码实现 四.大数除法 1.题目描述 2.问题分析 3.代码实现 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

    2024年02月07日
    浏览(47)
  • Verilog|有无符号加法与乘法运算

    一、无符号: 直接运算 二、有符号与无符号: 强制当作无符号运算 如c=a+b,a、b四位,c五位,计算时Verilog会将a和b扩展到五位再做加法,如果ab中有无符号数,则展宽会按照无符号数来,就是高位补0,因此有符号数结果将不正确。 解决:$signed(),c=a+$signed(b),扩展会按照有符

    2024年02月14日
    浏览(39)
  • [C++/PTA] 矩阵的乘法运算

    线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时,为一个列向量。 建立一个整数矩阵类matrix,其私有数据成员如下: 建立该整数矩阵类matrix构造函数; 建立一个 *(乘号)的运算符重载,

    2024年02月04日
    浏览(40)
  • 「Verilog学习笔记」移位运算与乘法

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网   分析  1、在硬件中进行乘除法运算是比较消耗资源的一种方法,想要在不影响延迟并尽量减少资源消耗,必须从硬件的特点上进行设计。根据寄存器的原理,由于是二进制,所以

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包