leetcode 29.两数相除
leetcode 29.两数相除
题目描述
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
解题思路
两数两除,不能使用乘法、除法和mod运算符,那么一个很简单的思路就出来了,就是不断的用被除数不断的减去除数,直到被除数小于除数的时候,结束迭代,但是如果这样做的话,势必会超时,举个例子 dividend=INT_MIN
, divisor=1
,如果这样迭代的话,就要花费很长的时间。
在计算机里,位运算的执行效率是非常高的,一个数字左移一位相当于除以2,右移一位相当于乘以2,那么就可以采用这样的方法来减少迭代次数。意思是,每一次相减都让除数的值翻倍,当然累加次数也要翻倍,直到dividend小于divisor的时候停止。举几个简单的例子
例子一: dividend = 10, divisor = 1
采用保留求解,就是10不停的减去1,那么需要循环十次。
采用位移的方法 ,是怎么操作的呢,看下面的表格,
- 首先建立一个临时的变量temp=divisor,让dividend去减temp,count记一,这时候发现dividend大于等于temp,那么dividor翻倍,count也翻倍,然后发现dividend仍然大于等于temp,temp继续翻倍,那么count也应该在原来的基础上翻倍(记录被减了多少次);
- 再继续判断temp继续翻倍的话,dividend就小于temp了,这时候dividend=2,让此时的dividend去和divisor比较,发现dividend大于等于divisor,那么就继续把temp=divisor,循环上面的操作
上面写的步骤只是为了好理解,其实就是 dividend = 8 + 2 + 余数 = 23*1 + 21*1 + 余数
dividend temp count 10 >= 2 1 1 10 >= 4 2 2 10 >= 8 4 4 10 < 16,此时10减去8,并与divisor比较 8 8 此时res+8 2 >= 2 1 1 2 < 4 此时 2减去2,并与divisor比较 2 2 此时res+2 合计 res 10
例子二:dividend = 123, divisor = 3;
123 = 25*3 + 23*3 + 3
dividend | temp | count |
---|---|---|
123 >= 6 | 3 | 1 |
123 >= 12 | 6 | 2 |
123 >= 24 | 12 | 4 |
123 >= 48 | 24 | 8 |
123 >= 96 | 48 | 16 |
123 < 192 此时 123减去96,并与divisor比较 | 96 | 32 此时res+32 |
27 >= 6 | 3 | 1 |
27 >= 12 | 6 | 2 |
27 >= 24 | 12 | 4 |
27 <= 48 此时27减去24,并与divisor比较 | 24 | 8 此时res+8 |
3 < 6 此时 3减去3,并与divisor比较 | 3 | 1 此时res+1 |
合计 res | 41 |
通过上面的例子就可以知道,通过位移的方法可以大大加上迭代的次数,提高运算效率,具体代码如下
class Solution {public:int divide(int dividend, int divisor) {if(divisor == 0 || dividend == 0){ // 被除数为零或者除数为零直接返回零return 0;}if(divisor == 1){ // 如果除数是1,就不需要额外的操作,直接返回被除数本身return dividend;}// 当被除数为INT_MIN, 除数是-1时需要特别注意,会出现溢出的情况,因为int范围是-2147483648~2147483647,相除的结果就是2147483648,当然是溢出;所以这里做一个特殊处理if(divisor == -1 && dividend == INT_MIN){ return INT_MAX;}bool sign = (dividend > 0)^(divisor > 0); // 通过异或, 判断是不是异号long a = dividend, b = divisor; // 这里把两个数转成long类型,并取绝对值,取绝对值是为了好运算,如果是不采用绝对值,就要分四种情况(--,++,+-,-+)来讨论反而更复杂a = abs(a);b = abs(b);int res = 0;while(a >= b){ // 如果a<b,那么循环终止int count = 1;long temp = b;while(a >= (temp<<1)){ // 不断的采用位移操作,尽可能减去最大的除数的倍数temp = temp << 1;count = count << 1;}a -= temp;res += count;} // 通过sign判断是否异号,并在结果res上添加对应符号return sign ? -res : res;}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
leetcode 29.两数相除相关推荐
- Java实现 LeetCode 29 两数相除
29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...
- leetcode 29 两数相除 C语言
题目 leetcode 29 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 diviso ...
- LeetCode 29. 两数相除(位运算)
1. 题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示 ...
- leetcode —— 29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整数除法的结果 ...
- [LeetCode]29 两数相除和一个小坑点
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商.示例 1:输入: ...
- leetcode 29.两数相除(python3)68ms
题目描述: 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整 ...
- LeetCode 29 两数相除
https://leetcode-cn.com/problems/divide-two-integers/submissions/ 解决方案 class Solution {public int di ...
- LeetCode高频题29. 两数相除:不用加减乘除号,求加法,减法,乘法,除法
LeetCode高频题29. 两数相除 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM竞赛 ...
- LeetCode-中等-29. 两数相除
LeetCode-中等-29. 两数相除 题目 引用自:LeetCode-中等-29. 两数相除(如有侵权联系删除) 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不 ...
最新文章
- 如何用staruml画包图_StarUML的9种图
- Eclipse + Spring boot +mybatis + mysql(后续)
- Exchange 2010 运维技巧一
- 独家 | 分答深度报告:42天估值1亿美金,分答如何获取百万付费用户?
- Mac连接远程Linux管理文件(samba)
- UI行业发展预测 系列规划的调整
- APP论坛社区软件源码 APP封装
- sklearn自定义svm核函数(外部和内部定义)
- 使用xUnit测试验证属性
- 基于OctTree的快速最近颜色搜索
- 面试题 04.08. 首个共同祖先
- Android开发笔记(一百七十七)借助FileProvider安装应用
- 微软软件基地落户广州
- 我有一百种方法让你的Excel连上数据库
- w7电脑蓝屏怎么解决_为你解答win7电脑蓝屏怎么办
- 前端职业规划 - 写给年轻的前端韭菜们
- AndroidStudio 跑马灯效果不自动滚动的原因
- apache-tomcat-10.0.18配置
- .Net Core 编码规范
- 获取搜狗音乐的真实路径方法
热门文章
- 底价团购潮 proscenic扫地机器人京东热卖
- 如何用计算机处理图片,修改图片用什么软件 小白必看的图片处理技巧_电脑故障...
- mysql2008百度云_SQLServer数据库之SQL Server 2008R2 企业版 百度云下载地址
- 华为OD机试 - 相对开音节(Java JS Python)
- 向凡客提议:建立ERP 深挖服装市场价值
- dumpsys meminfo分析
- u盘不能从计算机辅助东西卷问题,U盘文件无法复制的原因分析及解决方法(图文详情)...
- 留学目的地之马里兰州
- 【智能金融】乐信史红哲:成为分期电商第一股背后的技术战略
- 基本组网-(适用场景:一般家庭网络、微型企业网络、20人以内)、基础知识、设备知识、运营商选择、设备选择、设备配置