LeetCode:29. 两数相除

news2024/12/23 4:07:10

29. 两数相除

  • 1)题目
  • 2)思路
  • 3)代码
    • 1.初始代码
    • 2.第一次优化
    • 3.第二次优化
  • 4)结果
    • 1.初始结果
    • 2.第一次优化结果
    • 3.第二次优化结果

1)题目

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8-2.7335 将被截断至 -2

返回被除数 dividend 除以除数 divisor 得到的 商 。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。本题中,如果商 严格大于 2^(31 − 1) ,则返回 2^(31 − 1) ;如果商 严格小于 -2^31 ,则返回 -2^31

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333… ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333… ,向零截断后得到 -2 。

提示:

  • -2^31 <= dividend, divisor <= 2^(31 − 1)
  • divisor != 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2)思路

一开始是全部转成正数,后面发现比较麻烦,就采用全部转为负数这种方案。
代码优化思路:

dividend = 100, divisor = 3
return i   1	2	4	8	16	32
divisor    3	6	12	24	48	96

dividend = 96 + 3 = 991
输出:i = 32 + 1 = 33

3)代码

1.初始代码

直接循环相减

public static int divide(int dividend, int divisor) {
	// ------------ 前面的代码部分 ---------------
    if (dividend == 0) return 0;
    // 除数为1或-1
    if (divisor == 1) return dividend;
    if (divisor == -1) {
        if (dividend == Integer.MIN_VALUE) {
            return Integer.MAX_VALUE;
        }
        return -dividend;
    }

    // 除数等于被除数
    if (dividend == divisor) return 1;

    // 默认为正的
    boolean flag = true;
    // 全部转为负数
    if (dividend > 0) {
        dividend = -dividend;
        flag = !flag;
    }
    if (divisor > 0) {
        divisor = -divisor;
        flag = !flag;
    }

    // 被除数小于除数
    if (dividend > divisor) return 0;
    // ------------ 前面的代码部分 ---------------

	// ------------ 优化的代码部分 ---------------
    int i = 0;
    while (!(dividend > divisor)) {
        dividend -= divisor;
        ++i;
    }
    // ------------ 优化的代码部分 ---------------
   
    return flag ? i : -i;
}

2.第一次优化

循环相减改良版

public static int divide2(int dividend, int divisor) {
    // 前面的代码同上

	// ------------ 优化的代码部分 ---------------
    int i = 1;
    int value = divisor;
    while (dividend - divisor <= value) {
        if (dividend - divisor <= divisor) {
            divisor += divisor;
            i += i;
        } else {
            divisor += value;
            ++i;
        }
    }
    // ------------ 优化的代码部分 ---------------

    return flag ? i : -i;
}

3.第二次优化

采用递归方法

public static int divide(int dividend, int divisor) {
    // 前面的代码同上

	// ------------ 优化的代码部分 ---------------
    int i = divideValue(dividend, divisor, 0);
    // ------------ 优化的代码部分 ---------------

    return flag ? i : -i;
}


private static int divideValue(int dividend, int divisor, int i) {
    if (dividend > divisor) return 0;
    int value = divisor;
    int num = 1;
    while (dividend - value <= value) {
        value += value;
        num += num;
    }
    i = num + divideValue(dividend - value, divisor, i);
    return i;
}

4)结果

1.初始结果

在这里插入图片描述

2.第一次优化结果

在这里插入图片描述

3.第二次优化结果

在这里插入图片描述

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

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

相关文章

es 三 安装 es 安装kibana

目录 安装7.3.0 版本 下载地址 一个比一个快 页面测试访问 安装kibana 下载 Config/kibana.yml 配置修改开启中文 页面访问 安装7.3.0 版本 下载地址 一个比一个快 Index of /elasticsearch/ 下载中心 - Elastic 中文社区 下载中心 - Elastic 中文社区 官网下载 开箱…

CANape使用记录(一):CANape新建工程及标定观测

目录 1、概述 2、新建工程 3、添加观测与标定量 1、概述 CANape具有以下主要组件&#xff1a;在线测量&#xff0c;离线分析&#xff0c;诊断&#xff0c;打印机功能&#xff0c;数据管理&#xff0c;闪存编程&#xff0c;校准&#xff0c;CDM Studio和设备数据库编辑器&…

从工地到办公室:一个土木工程师如何学成测试技能?

提桶跑路成功了&#xff0c;这工地我是再也不来了。 ​ 工作中流的汗真的都是报专业时脑袋里进的水。 当时高考完&#xff0c;对于要学什么专业感到很迷茫&#xff0c;因为姨夫是干工地的&#xff0c;零几年土木专业的大学生&#xff0c;在我们这五线城市一个月也能够拿一万多…

汇聚支付APP+技术方案介绍

一、时序图 商户使用汇聚支付的 APP方案&#xff0c;需要两个步骤&#xff1a; 步骤一&#xff1a; 请求汇聚支付的支付接口&#xff0c;https://www.joinpay.com/trade/uniPayApi.action 获取返回的关键参数 rc_Result。 步骤二&#xff1a; 商户 APP 按照微信的 SDK 规范使…

pdf怎么拆分成一页一页的?办公常备工具说明

PDF&#xff08;Portable Document Format&#xff09;是一种用于创建和共享文档的文件格式。它由Adobe Systems开发&#xff0c;并已成为电子文档的通用格式。PDF文件可以包含文本、图像、表格、超链接和其他多媒体内容&#xff0c;使其成为一种非常方便的文件格式。 然而&…

ChatGPT国内免费使用的网站

ChatGPT是什么意思&#xff1f; ChatGPT全称&#xff1a;Chat Generative Pre-trained Transformer 在英文中“chat”是聊天的意思&#xff0c;GPT是一种预训练语言模型的缩写。 所以ChatGPT是一款功能非常强大的AI&#xff08;人工智能&#xff09;聊天机器人&#xff0c;能…

linux小技巧-如何修改IP(四种方法)

目录 项目场景&#xff1a; 方法分析及步骤介绍 原因分析&#xff1a; 解决方案&#xff1a; 项目场景&#xff1a; 项目上经常遇到修改IP的情况&#xff0c;这里总结一些各个情况下修改IP的方法&#xff0c;尤其时有时候没有主机屏幕显示&#xff0c;借助于命令行的方式修…

MATMacOS安装

MAT MacOS安装 文章目录 MAT MacOS安装第一章 简述第01节 介绍第02节 获取 第二章 配置第01节 显示包内容第02节 MAT配置Java环境变量第03节 MAT兼容低版本Java 第三章 问题第01节 正常启动效果第02节 可能遇到的问题 第一章 简述 第01节 介绍 什么是 MAT 工具&#xff1f; …

【随时更新】知识点回顾

哈夫曼编码和解码 C 哈夫曼编码 【介绍编码过程】 哈夫曼树编码及其图形化的实现 【使用可视化方式展现最终编码效果】 Python中使用哈夫曼算法实现文件的压缩与解压缩 【Python实现】 哈夫曼树 C语言实现 【图解如何生成】 编码过程 1. 使用二进制流&#xff0c;统计当前文件…

如何利用Smartbi电子表格进行财务常用账簿数据的联动查询

财务&#xff0c;是几乎所有企事业单位内部的核心组织。单位今年耗费几何&#xff0c;企业去年赚多少钱&#xff0c;平均成本在什么水平&#xff0c;为国家创造多少税收等等&#xff0c;所有这些信息&#xff0c;最终都通过财务账表的方式来体现。可以说&#xff0c;大家工作辛…

OSI/RM七层网络模型和网络协议

目录 1.OSI/RM七层网络模型1.1 结构图1.2 各层功能 2.OSI七层、TCP/IP四层、五层网络模型对比3.各层对应网络协议3.1 应用层3.2 传输层 1.OSI/RM七层网络模型 OSI/RM&#xff08;Open System Interconnection/Reference Model&#xff0c;开放式系统互联参考模型&#xff09;是…

前端到接口层的反序列化流程

前置知识 参考我的另一篇博客&#xff0c;(209条消息) Servlet和SpringMVC_fengwuJ的博客-CSDN博客&#xff0c;描述了Servlet与SpringMVC的关系&#xff0c;大致可以知道从前端请求&#xff0c;到后端接口的中间过程 反序列化流程 前篇文章中&#xff0c;走到 getMethodPara…

平台总线模型简介

1. 平台总线介绍 平台总线模型将一个驱动分成两部分 device.c, driver.c。一个描述硬件, 一个控制硬件。 平台总线通过比较字符串, 将name相同的device.c和driver.c匹配到一起来控制硬件。 driver通过平台总线去拿到device.c内容。 平台总线的优点是减少重复代码 提高效率。 …

中间件(三)- Kafka(一)

Kafka 1. Kafka简介1.1 名字由来1.2 主要特性1.3 相关术语1.4 架构图1.5 消息队列1.6 Kafka消费模式1. 一对一消费模式2. 一对多消费模式 1.7 消息中间件 2. Kafka安装及使用2.1 下载kafka2.2 修改配置文件2.3 启动2.4 docker启动 3. 简单指令3.1 topic相关3.2 Kafka 生产/消费…

`JOB`的正确打开方式

文章目录 JOB的正确打开方式 简介工作原理使用场景使用方式注意事项启动JOB失败的情况JOB正确打开方式错误方式正确方式进阶方式终极方式 总结 JOB的正确打开方式 最近有一些小伙伴在使用JOB时&#xff0c;由于使用不当&#xff0c;引起一些问题。例如把license占满&#xff0c…

ASEMI代理长电可控硅MCR100-8特征,MCR100-8应用

编辑-Z 长电可控硅MCR100-8参数&#xff1a; 型号&#xff1a;MCR100-8 VDRM/VRRM&#xff1a;600V IT(RMS)&#xff1a;0.8A 结点温度Tj&#xff1a;-40~125℃ 储存温度Tstg&#xff1a;-55 ~ 150℃ 通态电压VTM&#xff1a;1.7V 栅极触发电压VGT&#xff1a;0.8V 正…

泰克MDO4104C(Tektronix) mdo4104c混合域示波器

泰克 MDO4104C混合域示波器&#xff0c;1 GHz&#xff0c;4 通道&#xff0c;2.5 - 5 GS/s&#xff0c;20 M 点 ​泰克 MDO4104C 示波器是一款 6 合 1 集成示波器&#xff0c;可以配置可选的频谱分析仪、任意波形/函数发生器、逻辑分析仪、协议分析仪和 DVM/频率计数器。当配置…

黑盒测试能发现以下几类错误

黑盒测试能发现以下几类错误 黑盒测试是指在不考虑被测试软件的内部结构和工作原理的情况下&#xff0c;通过输入输出的方式对被测试软件进行测试。它主要关注被测试软件的功能是否达到预期的要求。黑盒测试能够发现以下几类错误。 1. 输入错误&#xff1a;黑盒测试可以检查被测…

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要&#xff0c;那什么是网站权重呢&#xff1f;网站权重是指搜索引擎给网站&#xff08;包括网页&#xff09;赋予一定的权威值&#xff0c;对网站&#xff08;含网页&#xff09;权威的评估评价。一个网站权重越高&#xff0c;在搜索引擎所占的份…

【C++】虚表和虚基表到底有哪些区别?

虚表和虚基表 虚表虚基表虚拟继承和虚函数都存在时的对象模型 虚表 我们知道&#xff0c;如果类中声明了的方法是用virtual进行修饰的&#xff0c;则说明当前这个方法要作为虚函数&#xff0c;而虚函数的存储和普通函数的存储是有区别的 当有虚函数声明时&#xff0c;编译器会…