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. 分析:题目意思很容易理解,就是不用乘除法和模运 ...
随机推荐
- android-support-xxxx.jar NoClassDefFoundError
当你的项目出现以下红色提示的时候,要小心了,因为很可能因为这个错误而导致解释不通的异常出现. Found 2 versions of android-support-v4.jar in the dep ...
- 【Qt】Qt之进程间通信(QProcess)【转】
简述 前几节里,分享了进程通信的几种方式:Windows消息机制.Shared Memory(共享内存),本节讲解下关于进程通信的另外一种方式-QProcess. 简述 命令行参数启动 说明 实现 命 ...
- Berkeley DB分布式探索
明天回家就没有网络,今晚就将整个编写过程记录下来.顺带整理思路以解决未能解决的问题. 标题有点托大,想将Berkeley DB做成分布式存储,感觉很高端的样子,实际上就是通过ssh将Berkeley ...
- Geoserver 相关学习
参考资料: http://geoserver.org/ http://docs.geoserver.org/ 相关文档 http://docs.geoserver.org/stable/en/user ...
- linux系统版本查看命令
发布:theboy 来源:net [大 中 小] 查看linux系统版本的命令 有如下命令可供参考: # lsb_release -a LSB Version: :core-3.1-ia ...
- js实现雪花飘落效果的代码
使用js实现雪花飘落的效果,用html5绘布加js写的雪花飘效果 . 代码: <html> <head> <script> /** * js与html5实现的雪花飘 ...
- php 读取文件头判断文件类型的实现代码
php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 例子: <?php $filename = "11.jpg"; //为图片的路径可以用d:/uploa ...
- 2013-07-23 IT 要闻速记快想
### ========================= ###苹果的新动向今天华尔街日报称,苹果正在测试13英寸的大号iPad,以及更大屏幕的iPhone.而早在五月份,韩国资讯网站 ET New ...
- dotNet中初始化器的使用
dotNet中初始化器的使用 2013年12月7日 13:27 有两类初始化器: 对象初始化器和集合初始化器 比如现在有一个User类: Public class User { public in ...
- epoll分析
Epoll详解及源码分析 1.什么是epoll epoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,都是I/O多路复用 ...