题目

将两个整数相除,要求不使用乘法、除法和 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 两个数的除法的更多相关文章

  1. LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)

    题目链接: https://leetcode.com/problems/divide-two-integers/?tab=Description   Problem :不使用乘法,除法,求模计算两个数 ...

  2. [LintCode] Divide Two Integers 两数相除

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  3. 【LeetCode每天一题】Divide Two Integers(两整数相除)

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  4. [LeetCode] Divide Two Integers 两数相除

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  5. lintcode 中等题:Single number III 落单的数III

    题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...

  6. [leetcode]29. Divide Two Integers两整数相除

      Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...

  7. [LeetCode] 29. Divide Two Integers 两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  8. 2016网易实习生编程题:数组中两个数的和等于sum

    题目 找出数组中两个数的和等于sum的这两个数 解题 这个题目做过很多次了,利用HashMap,key为 sum-A[i] value为 i 当 加入HashMap时候A[i] 已经存在map中,ge ...

  9. leetcode第28题--Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...

随机推荐

  1. android-support-xxxx.jar NoClassDefFoundError

    当你的项目出现以下红色提示的时候,要小心了,因为很可能因为这个错误而导致解释不通的异常出现. Found 2 versions of android-support-v4.jar in the dep ...

  2. 【Qt】Qt之进程间通信(QProcess)【转】

    简述 前几节里,分享了进程通信的几种方式:Windows消息机制.Shared Memory(共享内存),本节讲解下关于进程通信的另外一种方式-QProcess. 简述 命令行参数启动 说明 实现 命 ...

  3. Berkeley DB分布式探索

    明天回家就没有网络,今晚就将整个编写过程记录下来.顺带整理思路以解决未能解决的问题. 标题有点托大,想将Berkeley DB做成分布式存储,感觉很高端的样子,实际上就是通过ssh将Berkeley ...

  4. Geoserver 相关学习

    参考资料: http://geoserver.org/ http://docs.geoserver.org/ 相关文档 http://docs.geoserver.org/stable/en/user ...

  5. linux系统版本查看命令

    发布:theboy   来源:net   [大 中 小] 查看linux系统版本的命令 有如下命令可供参考: # lsb_release -a LSB Version:    :core-3.1-ia ...

  6. js实现雪花飘落效果的代码

    使用js实现雪花飘落的效果,用html5绘布加js写的雪花飘效果 . 代码: <html> <head> <script> /** * js与html5实现的雪花飘 ...

  7. php 读取文件头判断文件类型的实现代码

    php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 例子: <?php $filename = "11.jpg"; //为图片的路径可以用d:/uploa ...

  8. 2013-07-23 IT 要闻速记快想

    ### ========================= ###苹果的新动向今天华尔街日报称,苹果正在测试13英寸的大号iPad,以及更大屏幕的iPhone.而早在五月份,韩国资讯网站 ET New ...

  9. dotNet中初始化器的使用

    dotNet中初始化器的使用 2013年12月7日 13:27 有两类初始化器: 对象初始化器和集合初始化器 比如现在有一个User类: Public   class User { public in ...

  10. epoll分析

      Epoll详解及源码分析 1.什么是epoll epoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,都是I/O多路复用 ...