Leetcode刷题(二十九)

两数相除(Medium)

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8-2.7335 将被截断至 -2 。返回被除数 dividend 除以除数 divisor 得到的 商 。注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [231,  2311] 。本题中,如果商 严格大于 2311 ,则返回 2311 ;如果商 严格小于 -231 ,则返回 -231 。示例 1:输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。
示例 2:输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。
提示:-231 <= dividend, divisor <= 231 - 1
divisor != 0
Related Topics
位运算
数学

思路分析

这道题要求不能使用乘法、除法以及余数来完成除法运算。我首先想到的是使用加减法,保留整数部分的除法可以看作是被除数减去整数个除数。我在根据这样的思路进行答题之后显示超时,这样计算对于比较大的数确实要花费大量的时间复杂度,这里就要使用一个方法叫做位移算法(也称为二进制除法)。位移算法通过将除数左移(即乘以2)来逼近被除数,这样可以更快地接近结果,从而提高效率。这种方法特别适用于处理大数除法,因为它减少了所需的迭代次数。
以下是使用位移算法实现整数除法的基本步骤:

处理符号:首先保存原始除数和被除数的符号,并使用它们的绝对值进行计算。
初始化:初始化一个变量来保存结果。
比较和位移:当被除数大于或等于除数时,不断地将除数左移(乘以2),直到它超过被除数。在每次位移时,也相应地位移一个用于计数的变量。
计算部分结果:将被除数减去最后一次位移后的除数,将结果加到最终结果中。
重复:重复以上步骤,直到被除数小于原始除数。
处理结果的符号:根据原始除数和被除数的符号,确定最终结果的符号。

使用位移来实现除法的原理基于二进制数的性质。在这种方法中,我们通过比较被除数与不断左移(即乘以2)的除数来逐步逼近最终的商。下面是详细的步骤和解释:

使用10除以3的例子,我们使用位移方法来求解:

  1. 初始化:将10和3都视为正数,因为它们已经是正数。商的初始值为0。

  2. 比较和逼近

    • 将除数3左移,直到它小于或等于被除数10。3左移1位变成6(小于10),3左移2位变成12(大于10),所以我们使用6(3左移1位)。
    • 从10中减去6,剩下4。由于我们左移了1位,这表示3的2倍,所以在商中加上2^1,即2。
  3. 处理剩余的部分

    • 现在处理剩下的4。3不能再左移,因为它会超过4。但是3本身小于4,所以我们可以从4中减去3,剩下1。
    • 在商中加上2的0次幂(因为我们没有左移),即加1。
  4. 最终结果

    • 到目前为止,我们已经从10中减去了6(3左移1位)和3,总共减去9,对应的商是2(对应6)加1(对应3),所以最终的商是3。

因此,10除以3的商是3,余数是1。使用位移方法进行的除法操作主要是逐步逼近被除数,直到无法再减去除数的任何倍数为止。

代码实现

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int divide(int dividend, int divisor) {// 处理溢出情况if (dividend == Integer.MIN_VALUE && divisor == -1) {return Integer.MAX_VALUE;}// 使用长整型防止溢出,并保存符号long longDividend = Math.abs((long)dividend);long longDivisor = Math.abs((long)divisor);boolean negative = (dividend < 0) ^ (divisor < 0);long result = 0;while (longDividend >= longDivisor) {long temp = longDivisor, multiple = 1;while (longDividend >= (temp << 1)) {temp <<= 1;multiple <<= 1;}longDividend -= temp;result += multiple;}return negative ? (int)-result : (int)result;}}
//leetcode submit region end(Prohibit modification and deletion)

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

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

相关文章

C#,最小生成树(MST)博鲁夫卡(Boruvka)算法的源代码

Otakar Boruvka 本文给出Boruvka算法的C#实现源代码。 Boruvka算法用于查找边加权图的最小生成树&#xff08;MST&#xff09;&#xff0c;它早于Prim和Kruskal的算法&#xff0c;但仍然可以被认为是两者的关联。 一、Boruvka算法的历史 1926年&#xff0c;奥塔卡博鲁夫卡&…

redis 分布式锁的原理

Redis 分布式锁是通过利用 Redis 的原子操作和特性来实现的。下面是 Redis 分布式锁的基本原理&#xff1a; 获取锁&#xff1a;当一个进程或线程需要获取锁时&#xff0c;它会通过执行 Redis 命令&#xff08;例如 SETNX&#xff09;在 Redis 中尝试设置一个特定的键作为锁。如…

QQ云端机器人登录系统php源码

这款源码主要是针对群机器人爱好者的&#xff0c;这是一个通过对接挂机宝里面机器人框架的一个网页站点&#xff0c;用户通过网页登录 QQ 账号至挂机宝里面框架&#xff08;可扫码登录、账密登录、跳转 QQ 快捷登录&#xff09;&#xff0c;无需通过机器人即可实现登录&#xf…

《设计模式的艺术》笔记 - 观察者模式

介绍 观察者模式定义对象之间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。 实现 myclass.h // // Created by yuwp on 2024/1/12. //#ifndef DESIGNPATTERNS_MYCLASS_H #define DESIGNPATTERNS_MYCLA…

Oracle Linux 6.10 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

ZK高可用架构涉及常用功能整理

ZK高可用架构涉及常用功能整理 1. zk的高可用系统架构和相关组件1.1 Quorum机制1.2 ZAB协议 2. zk的核心参数2.1 常规配置2.2 特殊优化配置 3. zk常用命令3.1 常用基础命令3.2 常用运维命令 4. 事务性4.1 数据写流程4.2 数据读流程 5. 疑问和思考5.1 zk不擅长处理哪些场景&…

gitlab runner 安装、注册、配置、使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

「一本通 3.6 例 1」分离的路径

题目描述 为了从 F F F 个草场中的一个走到另一个&#xff0c;贝茜和她的同伴们不得不路过一些她们讨厌的可怕的树。奶牛们已经厌倦了被迫走某一条路&#xff0c;所以她们想建一些新路&#xff0c;使每一对草场之间都会至少有两条相互分离的路径&#xff0c;这样她们就有多一…

vue常用指令(v-show)

一、v-show 指令 作用: 根据真假值,切换元素的显示状态 二、代码演示 1、v-show 绑定判断条件后&#xff0c;根据布尔值决定是否显示图片 不显示图片 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…

骨传导是哪个意思?骨传导的应用领域在哪

很多人都问我骨传导是哪个意思&#xff1f;骨传导的应用领域在哪&#xff1f;我们都知道声音能够在固体、液体、空气三种介质中传播。通常情况下&#xff0c;声音进入我们内耳的方式主要有两种&#xff1a;空气传导和骨传导&#xff0c;骨传导也就是通过固体传导。我们比较熟悉…

深度学习——pycharm远程连接

目录 远程环境配置本地环境配置&#xff08;注意看假设&#xff01;&#xff01;!这是很多博客里没写的&#xff09;步骤1步骤2步骤2.1 配置Connection步骤2.2 配置Mappings 步骤3 配置本地项目的远程解释器技巧1 pycharm中远程终端连接技巧2 远程目录技巧3 上传代码文件技巧4 …

2024.1.23力扣每日一题——最长交替子数组

2024.1.23 题目来源我的题解方法一 枚举 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2765 我的题解 方法一 枚举 每次都以两个相邻作为满足要求的循环数据&#xff0c;并且以一个布尔变量控制循环的位置 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) pub…

【图像拼接】论文精读:Eliminating Structure and Intensity Misalignment in Image Stitching

第一次来请先看这篇文章:【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用说明、创新思路分享等(不定期更新) 图像拼接系列相关论文精读 Seam Carving for Content-Aware Image ResizingAs-Rigid-As-Possible Shape ManipulationAdap…

自锁设计更稳固,同为科技(TOWE)服务器电脑IEC 60320电源线

说起IEC 60320标准电源线&#xff0c;可能很多人不知道具体是什么东西&#xff0c;但要说到台式电脑电源线&#xff0c;那大家就都能耳熟能详了。IEC 60320电源线的用途十分广泛&#xff0c;包括家用电器、医疗设备、数据中心服务器、商业机械设备、自动化生产线等都是用此类电…

API网关-Apinto压缩包方式自动化安装配置教程

文章目录 前言一、Apinto安装教程1. 复制脚本2. 增加执行权限3. 执行脚本4. Apinto命令4.1 启动Apinto4.2 停止Apinto4.3 重启Apinto4.4 查看Apinto版本信息4.5 加入Apinto集群4.6 离开Apinto集群4.7 查看Apinto节点信息 5. 卸载Apinto 二、Apserver(Apinto Dashboard V3)安装教…

将文件以指定格式存储~BMP~C的实现~FAT32格式

参考&#xff1a; BMP文件学习笔记&#xff08;一&#xff09;&#xff1a; C/C语言实现.bmp文件读写_c 写入bmp-CSDN博客 U盘到底用什么格式好&#xff1f;FAT32、NTFS还是exFAT&#xff1f; - 知乎 (zhihu.com) 第一部分&#xff1a; 位图文件头 BITMAPFILEHEADER&#x…

力扣1027. 最长等差数列

动态规划 思路&#xff1a; 可以参考力扣1218. 最长定差子序列目前不清楚公差&#xff0c;可以将序列最大最小值找到&#xff0c;公差的范围是 [-(max - min), (max - min)]&#xff0c;按公差递增迭代遍历求出最长等差数列&#xff1b; class Solution { public:int longest…

Mybatis-SqlSessionFactory/多数据源

下面的代码演示了发送一个HTTP请求到Controller&#xff0c;如果key“dev”&#xff0c;则查询dev数据库&#xff0c;否则查询默认的数据库 Resourceprivate SqlSessionFactory sqlSessionFactory;Resourceprivate DataSource defaultDataSource;Resourceprivate XXXMapper xxx…

go语言下划线、变量和常量

1、下划线 “_”是特殊标识符&#xff0c;用来忽略结果。 1.1. 下划线在import中 在Golang里&#xff0c;import的作用是导入其他package。import 下划线&#xff08;如&#xff1a;import hello/imp&#xff09;的作用&#xff1a;当导入一个包时&#xff0c;该包下的文件里…

IDEA 创建maven项目没有src

环境&#xff1a; IntelliJ IDEA 2022.3.3 (Ultimate Edition) JDK 17 Windows 11 10.0 Maven 3.9.5 创建maven项目的时候没有src目录 试过网上说的重新配置maven库&#xff0c;增加vm-options&#xff0c;并没有什么用。直到我看见了 正常创建就好了。