lintcode 中等题:Divide Two Integers 两个数的除法
题目
将两个整数相除,要求不使用乘法、除法和 mod 运算符。
如果溢出,返回 2147483647 。
给定被除数 = 100 ,除数 = 9,返回 11
解题
15%的通过率,减法,位运算?表示不知道如何下手。
法一:利用减法,超时,人工直接去除的一些情况太流氓。
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(dividend == 0)
return 0;
if(dividend == divisor)
return 1;
int count = 0;
int flag1 = 1;
int flag2 = 1;
if(dividend == Integer.MIN_VALUE && divisor ==1)
return dividend;
if(dividend == Integer.MIN_VALUE && divisor == -1)
return 2147483647;
if(dividend<0){
flag1 = -1;
dividend = -dividend;
}
if(divisor<0){
flag2 = -1;
divisor = -divisor;
}
// dividend = 2147483647;
// divisor = 2;
if(divisor == 1)
return dividend*flag1*flag2;
while(dividend >= divisor){
dividend -= divisor;
count +=1;
}
return count*flag1*flag2;
}
}
Java Code
法二:批量减法,参考博客,但是还是超市,除数是1的时候超时,是1的时候我单独处理,是2的时候超时
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(dividend == 0)
return 0;
if(dividend == divisor)
return 1;
int count = 0;
int flag1 = 1;
int flag2 = 1;
if(dividend == Integer.MIN_VALUE && divisor ==1)
return dividend;
if(dividend == Integer.MIN_VALUE && divisor == -1)
return 2147483647;
if(dividend<0){
flag1 = -1;
dividend = -dividend;
}
if(divisor<0){
flag2 = -1;
divisor = -divisor;
}
// dividend = 2147483647;
// divisor = 2;
if(divisor == 1)
return dividend*flag1*flag2;
while(dividend >= divisor){
int sum = divisor;
int count1 = 1;
while(sum + sum <= dividend){
count1 += count1;
sum += sum;
}
dividend -= sum;
count += count1;
}
return count*flag1*flag2;
}
}
Java Code
法三:利用位运算
参考博客,感觉与法二很像的,我把二中减肥换成位运算,也是运行超时,我不理解,直接用他的程序就可以通过。
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(divisor ==0)
return Integer.MAX_VALUE;
if(divisor == -1 && dividend == Integer.MIN_VALUE)
return Integer.MAX_VALUE;
int count = 0;
long pDividend = Math.abs((long)dividend);
long pDivisor = Math.abs((long)divisor);
while(pDividend >= pDivisor){
int count1 = 0;
while((pDivisor<<count1)<= pDividend){
count1++;
}
count += 1<<(count1 - 1);
pDividend -=(pDivisor<<(count1 - 1));
}
if( dividend >0 && divisor >0 || dividend<0 && divisor<0)
return count;
else
return -count;
}
}
Java Code
博客中的位运算改成减法的也可以通过,就是我自己搞的减法的就是能通过,无法理解
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(divisor ==0)
return Integer.MAX_VALUE;
if(divisor == -1 && dividend == Integer.MIN_VALUE)
return Integer.MAX_VALUE;
int count = 0;
long pDividend = Math.abs((long)dividend);
long pDivisor = Math.abs((long)divisor);
while(pDividend >= pDivisor){
int count1 = 1;
long sum = pDivisor;
while(( sum + sum)<= pDividend){
count1 += count1;
sum +=sum;
}
count += count1;
pDividend -= sum;
}
if( dividend >0 && divisor >0 || dividend<0 && divisor<0)
return count;
else
return -count;
}
}
Java Code
lintcode 中等题:Divide Two Integers 两个数的除法的更多相关文章
- LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)
题目链接: https://leetcode.com/problems/divide-two-integers/?tab=Description Problem :不使用乘法,除法,求模计算两个数 ...
- [LintCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- 【LeetCode每天一题】Divide Two Integers(两整数相除)
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- [LeetCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- lintcode 中等题:Single number III 落单的数III
题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- [leetcode]29. Divide Two Integers两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...
- [LeetCode] 29. Divide Two Integers 两数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- 2016网易实习生编程题:数组中两个数的和等于sum
题目 找出数组中两个数的和等于sum的这两个数 解题 这个题目做过很多次了,利用HashMap,key为 sum-A[i] value为 i 当 加入HashMap时候A[i] 已经存在map中,ge ...
- leetcode第28题--Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...
随机推荐
- DIV_ROUND_UP(x,y)实现x/y向上取整
#define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y)) 1.问题 x.y都是整数,且x > 1, y > 1,求 x / y的向上取整,即: ...
- 转:Java HashMap实现详解
Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1. HashMap概述: HashMap是基于哈希表的M ...
- .NET SDK和下载
http://blogs.msdn.com/b/dotnet/p/dotnet_sdks.aspx .NET SDK和下载 您可以通过下载.NET框架针对包和软件开发工具包,并使用它们与Visual ...
- MySQL不同库名相同表结构实现主从配置
数据库版本 5.6.16 在两个服务器上,存在不同名字的数据库,但是两个数据库中的所有表结构相同,实现主从复制. 主库服务器的数据库名为yoon,从库服务器的库名为hank 在从库的my.cnf配置文 ...
- andriod
谷歌提供的安卓源码中,网址如下:http://androidxref.com http://blog.csdn.net/zoe6553/article/details/6622258
- 网络笔记01-2 scoket
scoket: 1.socket /** 第一个参数(domain): 表示用什么协议 AF_INET 为IPV4开发 第二个参数(type): 表示scoket为什么类型SOCK_STREAM为TC ...
- 静态wenb开发,动态web开发
- Android bluetooth low energy (ble) writeCharacteristic delay callback
I am implementing a application on Android using BLE Api (SDK 18), and I have a issue that the trans ...
- UIScrollView显示超出屏幕大小的内容
1:UIScrollView在初始化的时候可以指定frame,它的frame和其他控件不太一样的地方是: 它的frame指的的“可视大小”,也就是我们指定多大的frame来看一张图片,当然最大就是屏幕 ...
- python 链接hive
http://blog.csdn.net/xubcing/article/details/8350287 http://www.centoscn.com/python/2014/0921/3801.h ...