剑指Offer-面试题1:整数除法——你真的会用Math.abs吗?

news2024/11/19 16:40:53

整数除法

题目要求

输入2个int型整数,它们进行除法计算并返回商,要求不得使用乘号'*'、除号'/'及求余符号'%'。当发生溢出时,返回最大的整数值。假设除数不为0。例如,输入15和2,输出15/2的结果,即7。

有问题的方法

一上来就想到用减法的方法,直接一顿输出。


public class DivisionClass {
    public static Integer DivisionMethod(Integer dividend, Integer divisor) {
        Integer signNum = 0;
        Integer quotient = 0;
        if (divisor == 0) {
            throw new RuntimeException("除数不能为0");
        }
        if (dividend == 0) {
            return quotient;
        }
        if (Math.signum(dividend) == Math.signum(divisor)) {
            //同符号则signNum为正
            signNum = 1;
        } else {
            signNum = -1;
        }
        
        Integer pureDividend = Math.abs(dividend);
        Integer pureDivisor = Math.abs(divisor);
        while (pureDividend > 0) {
            pureDividend = Math.subtractExact(pureDividend, pureDivisor);
            if (pureDividend > 0) {
                quotient++;
            }
        }
        return quotient * signNum;
    }
}
复制代码

很明显,问题多多!

问题一

题目中要求输入的是int类型,但是函数定义给的是输入两个Integer,这和题目中的要求不同

问题二

题目中要求不能使用乘除,但是在最后一个return quotient * signNum;这里很不幸,忘记了这一点,使用了乘法。。。

问题三

大量使用了Math类中的方法,题目中倒也没说不行,但是后来看了解法之后,感觉还是少使用Math类中的方法更好 同时,对于Math类中的方法,使用中的坑还是不太注意 注意这里的Math.abs

Note that if the argument is equal to the value of Integer.MIN_VALUE, the most negative 
representable int value, the result is that same value, which is negative.
复制代码

在它的注释里面有写当输入的是Integer.MIN_VALUE的时候,返回的结果还是Integer.MIN_VALUE,这里是因为 int的最大值是2的31次方-1(0x7fffffff),int的最小值是-2的31次方(0x80000000)

所以while (pureDividend > 0)这里实际上就有问题了,当输入的是Integer.MIN_VALUE的时候,直接不会走这个while,就会直接返回商为0

问题四

当被除数很大但除数很小时,减法操作执行的次数会很多。例如,求Integer.MAX_VALUE/1,减1的操作将执行2的31次方-1次,需要很长的时间。如果被除数是n,那么这种解法的时间复杂度为O(n)。所以我们可以将上述解法稍做调整。当被除数大于除数时,继续比较判断被除数是否大于除数的2倍,如果是,则继续判断被除数是否大于除数的4倍、8倍等。如果被除数最多大于除数的2k倍,那么将被除数减去除数的2k倍,然后将剩余的被除数重复前面的步骤。由于每次将除数翻倍,因此优化后的时间复杂度是O(logn)。

问题五

将负数转换成正数存在一个小问题。对于32位的整数而言,最小的整数是-2的31次方,最大的整数是2的31次方-1。因此,如果将-2的31次方转换为正数则会导致溢出。由于将任意正数转换为负数都不会溢出,因此可以先将正数都转换成负数,用前面优化之后的减法计算两个负数的除法,然后根据需要调整商的正负号。

正确的方法

    public static int DivisionMethodWithOutBug(int dividend, int divisor) {
        if (dividend == 0x80000000 && divisor == -1) {
            return Integer.MAX_VALUE;
        }
        int negative = 2;
        if (dividend > 0) {
            negative--;
            dividend = -dividend;
        }
        if (divisor > 0) {
            negative--;
            divisor = -divisor;
        }
        int result = divideCode(dividend, divisor);
        return negative == 1 ? -result : result;
    }


    private static int divideCode(int dividend, int divisor) {
        int result = 0;
        while (dividend <= divisor) {
            int value = divisor;
            int quotient = 1;
            while (value >= 0xc0000000 && dividend <= value + value) {
                quotient += quotient;
                value += value;
            }
            result += quotient;
            dividend -= value;
        }
        return result;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用OpenCV的函数polylines()绘制多条相连的线段和多边形;使用函数fillPoly()绘制带填充效果的多边形

函数polylines()可用来根据点集绘制多条相连的线段&#xff0c;也可用来绘制多边形。 函数polylines()有两种原型&#xff0c;这里只向大家介绍比较常用的那种原型。 函数polylines()的C原型如下&#xff1a; void cv::polylines(InputOutputArray img,const Point *const *…

Power BI 11个必学官方示例数据案例(附下载链接)

在开始学习Power BI时&#xff0c;最大的问题就是不知道哪里找数据&#xff0c;或者有数据却对搭建看板毫无头绪&#xff0c; 不知道该从哪里下手。 本文收集整理了官网上最值得学习的11个案例&#xff0c;包括不同行业和分析方法&#xff0c;方便大家按需学习。点击标题即可转…

安徽省建设工程监理人员从业水平能力证书

安徽省建设监理协会会员单位从业人员是指已通过安徽省建设监理协会组织的从业水平能力认定考试&#xff0c;取得《安徽省建设工程监理人员从业水平能力证书》&#xff0c;并在工程建设中从事监理工作的监理工程师和监理员&#xff08;以下简称“监理工程师、监理员”&#xff0…

LLVM中矩阵Matrix的实现分析

1 背景说明 Clang提供了C/C语言对矩阵的扩展支持&#xff0c;以方便用户使用可变大小的二维数据类型来实现计算&#xff0c;目前该特性还是实验版&#xff0c;设计和实现都在变化中。LLVM目前设计为支持小型列矩阵&#xff08;column major&#xff09;&#xff0c;其对矩阵的…

Java字节码介绍

Java字节码 概述 学习 Java 的都知道&#xff0c;我们所编写的 .java 代码文件通过编译将会生成 .class 文件&#xff0c;最初的方式就是通过 JDK 的 javac 指令来编译&#xff0c;再通过 java 命令执行 main 方法所在的类&#xff0c;从而执行我们的 Java 程序。而在这中间所…

【矩阵论】6. 矩阵理论——算子范数

6.2 算子范数 6.2.1 定义 CnC^nCn 上任一向量范数 ∥X∥V\Vert X\Vert_V∥X∥V​ 都产生一个矩阵范数 ∥A∥max⁡x≠0{∥AX∥V∥X∥V}\Vert A\Vert\max_{x\neq 0}\limits \{\frac{\Vert AX\Vert_V}{\Vert X\Vert_V}\}∥A∥x0max​{∥X∥V​∥AX∥V​​} ,X∈CnX\in C^nX∈Cn…

Linux 管理联网 测试网络连通性 -- Ping 命令详解 tracepath命令详解

测试网络的连通性 # 我们测试网络的连通性&#xff0c;一般就是使用的 PIng 命令 Ping &#xff1a; 一般格式 &#xff1a; ping [ 选项 ] < 目标主机名 或 IP 地址 > 常用选项 &#xff1a; - c 数字 &#xff1a; 用于 设定本命令发出的 ICMP 消息包的…

限量,Alibaba首发“Java成长笔记”,差距不止一点点

前言 本文是为了帮大家快速回顾了Java中知识点&#xff0c;这套面试手册涵盖了诸多Java技术栈的面试题和答案&#xff0c;相信可以帮助大家在最短的时间内用作面试复习&#xff0c;能达到事半功倍效果。 本来想将文件上传到github上&#xff0c;但由于文件太大有的都无法显示…

CentOS7使用yum安装Golang(超详细)

使用yum安装Golang前言一、go语言介绍二、yum安装golang1.安装go版本为1.19.41.1执行yum install go&#xff08;报错&#xff09;1.2配置go的安装源1.3执行yum install golang1.4查看go的安装版本2.安装go版本为 1.11rc2&#xff08;这个参考&#xff0c;不用操作&#xff09;…

Docker镜像的原理

centos7系统 包括2部分&#xff0c; linux内核&#xff0c;作用是提供操作系统的基本功能&#xff0c;和机器硬件交互&#xff0c;如何读取磁盘数据&#xff0c;管理网络&#xff0c;使用C编写的&#xff0c;由linus的开发团队&#xff0c;内核只提供操作系统的基本功能和特性…

修改嵌入式 ARM Linux 内核映像中的文件系统

zImage 是编译内核后在 arch/arm/boot 目录下生成的一个已经压缩过的内核映像。通常我们不会使用编译生成的原始内核映像 vmlinux&#xff0c;因其体积很大。因此&#xff0c;zImage 是我们最常见的内核二进制&#xff0c;可以直接嵌入到固件&#xff0c;也可以直接使用 qemu 进…

C++的OpenCV中cv::minAreaRect的返回角度的数值范围是多少?

版本不一样的时候&#xff0c;返回也不一样。 我使用opencv/4.5.5。 下图是使用minAreaRect判定的角度&#xff0c;可以看到&#xff0c;数值范围是[0,90]&#xff0c;看起来很离谱。 画出这张图使用的程序如下&#xff1a; C int main() {std::string prefix1 "/mn…

SpringMvc+Thymeleaf实现数据渲染

Thymeleaf是spring boot推荐使用的模板语法&#xff0c;它可以完全替代 JSP 。 从代码层次上讲&#xff1a;Thymeleaf是一个java类库&#xff0c;它是一个xml/xhtml/html5的模板引擎&#xff0c;可以作为mvc的web应用的view层。 Thymeleaf 提供spring标准方言和一个与 SpringMV…

Ui自动化概念+Web自动化测试框架介绍

目录 UI 1.UI自动化测试概念:我们先明确什么是UI 2.为什么对UI采用自动化测试? 3.什么项目适合做UI自动化测试? 4.UI自动化测试介入时机 5.UI自动化测试所属分类 Web自动化测试框架介绍 2.Selenium框架介绍及特点: Web自动化测试环境搭建 2.元素定位(一) idclassna…

【数据结构】栈与集合类Stack

目录 一、栈 二、Java中的集合类之Stack 1、介绍 2、构造方法 3、常用方法 1.push 2.pop 3.peek 4.search 5.empty 三、实现Stack 1、准备字段 2、实现判空 3、实现压栈 4、实现出栈 5、实现获取栈尾元素 6、指定元素到栈顶的距离 一、栈 栈(stack)是一种比较…

Redis高可用之哨兵模式(第二部分)

引言 接上一篇&#xff0c;今天我们来聊一聊Redis的高可用的第二个解决方案&#xff1a;哨兵模式。 一、Redis哨兵模式 哨兵模式&#xff08;sentinel&#xff09;是Redis提供的高可用的解决方案之一。由一个或者多个sentinel示例组成的sentinel系统&#xff0c;可以监听任意…

(Java高级教程)第二章Java多线程常见面试题-第二节:JUC(java.util.concurrent)

文章目录一&#xff1a;Callable接口二&#xff1a;ReentrantLock三&#xff1a;原子类四&#xff1a;信号量SemaphoreJUC&#xff1a;JUC是java.util.concurrent包的简称&#xff0c;目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题 一…

智己LS7发布,预售价格区间35-50万元

12月20日&#xff0c;智己首款中大型大五座SUV 智己LS7开启预售。动力配置&#xff1a; •最大零百加速4.5S&#xff1b; •峰值公里425kw&#xff0c;峰值扭矩725Nm&#xff1b; •提供90度和100度电池选项&#xff1b; •最大CLTC续航660km&#xff1b;空间配置&#xff1a; …

06. http协议基础,带你了解网络访问

06. http协议基础&#xff0c;带你了解网络访问 渗透测试学习路径 计算机基础网络基础WEB漏洞渗透测试 渗透测试和WEB安全漏洞的区别&#xff1f; 渗透测试包含WEB安全漏洞 WEB网站只是单一的网站服务&#xff0c;在渗透测试过程中可能不是攻击网站&#xff0c;而是寻找其他…

ElasticSearch全文检索原理及过程

倒排索引 ElasticSearch的搜索引擎中&#xff0c;每个文档都有一个对应的文档 ID&#xff0c;文档内容被表示为一系列关键词的集合。例如文档 1 经过分词&#xff0c;提取了 20 个关键词&#xff0c;每个关键词都会记录它在文档中出现的次数和出现位置。那么&#xff0c;倒排索…