【一天一道LeetCode】#29. Divide Two Integers
一天一道LeetCode系列
(一)题目
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
(二)解题
这题看起来很简单,一开始想到的方法就是从0开始一次累加除数,一直到比被除数大为止,好无悬念,这样做的结果就是超时了。
用移位来实现除法效率就比较高了。具体思路可以参考二进制除法。下面举个例子来说明。
例如:10/2 即10010/10
第一步:1-10不够减,结果添0,左移位变成10
第二步:10-10够减,结果添1,余010,左移位0
第三步:0-10不够减,结果添0,左移一位变成01
第四步:1-10不够减,结果添0,左移一位变成10
第五步:10-10够减,结果添1,后面没有位了,运算完毕
10010 = 10 01001 即 10 = 2 5。
那么按照这种思路,我们每次对除数进行移位,找到等于或小于被除数(dividend)的最大值(max),判断移位次数k,结果ret += 1<<k,然后dividend-=max,依次循环,知道dividend小于除数就运算完毕了。
还是以10/2为例
第一步:对2移位,找到等于或小于10的最大值8,移位次数k=2,ret=4,dividend = 10-8=2;
第二步:对2移位,找到等于或小于2的最大值2,移位次数k=0,ret=4+1=5,dividend=0
运算完毕!
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor == 0) return 2147483647;//限制除数不能为0
long long absdividend = abs((long long)dividend);//定义long long类型是为了防止越界
long long absdivisor = abs((long long)divisor);//求绝对值
long long ret = 0;
while(absdividend >= absdivisor)//循环条件被除数大于除数
{
long long count = 1;
long long tmpdiv = absdivisor;//初始值为除数
while(tmpdiv<=absdividend){//移位后判断
count<<=1;
tmpdiv<<=1;
}//找到了小于或等于被除数的最大值
absdividend-=(tmpdiv>>1);//注意此处最大值应为tmpdiv>>1
ret +=(count>>1);//上面多左移了一次,这里右移回来
}
if((dividend>0&&divisor<0)||(dividend<0&&divisor>0)){//判断正负
ret = 0-ret;
}
if(ret>2147483647 ||ret<-2147483648) return 2147483647;//判断越界
return (int)ret;//强制转换成int后退出
}
};
【一天一道LeetCode】#29. Divide Two Integers的更多相关文章
- [LeetCode] 29. Divide Two Integers 两数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- Java [leetcode 29]Divide Two Integers
题目描述: Divide two integers without using multiplication, division and mod operator. If it is overflow ...
- [leetcode]29. Divide Two Integers两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...
- [LeetCode] 29. Divide Two Integers(不使用乘除取模,求两数相除) ☆☆☆
转载:https://blog.csdn.net/Lynn_Baby/article/details/80624180 Given two integers dividend and divisor, ...
- [leetcode]29. Divide Two Integers 两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- [LeetCode] 29. Divide Two Integers ☆☆
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- [LeetCode]29. Divide Two Integers两数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)
题目链接: https://leetcode.com/problems/divide-two-integers/?tab=Description Problem :不使用乘法,除法,求模计算两个数 ...
- LeetCode: 29. Divide Two Integers (Medium)
1. 原题链接 https://leetcode.com/problems/divide-two-integers/description/ 2. 题目要求 给出被除数dividend和除数divis ...
- [leetcode] 29. divide two integers
这道题目一直不会做,因为要考虑的corner case 太多. 1. divisor equals 0. 2. dividend equals 0. 3. Is the result negative ...
随机推荐
- Xcode中lldb的REPL调试方法
Xcode中lldb调试器有一个repl语句,可以用来模拟swift解释器的REPL行为,即Read Eval Print Loop. 在Xcode里随意打开程序,中断入调试器.在调试控制台中输入re ...
- Android TV开发总结(一)构建一个TV app前要知道的事儿
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52792562 前言:近年来,智能 ...
- 两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。
#include <iostream> using namespace std; /*函数作用:取待排序序列中low.mid.high三个位置上数据,选取他们中间的那个数据作为枢轴*/ i ...
- 24 服务AIDL
AIDL远程访问服务的方法 创建一个接口类写上方法 然后修改后缀java为aidl 在服务中创建一个类继承Stub类 在远程访问服务的进程把AIDL文件复制(包名不能改变) XXXX.Stub.asI ...
- Hazelcast源码剖析之Eviction
v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...
- GDAL使用插件方式编译HDF4、HDF5以及NetCDF的bug修改
GDAL库中提供了很方便的插件机制来扩展支持的数据格式,比如HDF4.HDF5.NetCDF.FileGDB.Postgre.Oralce等等.都可以通过插件的方式来使得GDAL支持相应的格式.最近将 ...
- SSH深度历险(四) Maven初步学习
这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理 ...
- Android简易实战教程--第三话《自己实现打电话》
需要一个文本输入框输入号码,需要一个按钮打电话.本质:点击按钮,调用系统打电话功能. xml布局文件代码:: <LinearLayout xmlns:android="http://s ...
- EBS的性能调优
metalink Tuning performance on eBusiness suite (Doc ID 744143.1) 这篇文档描述了如何调查电子商务套件的整体性能下降. ...
- MANIFEST.MF Error: No available bundle exports package
Issue: When you imported some 3rd jars and compiled MANIFEST.MF, you may got following compling erro ...