题目

将两个整数相除,要求不使用乘法、除法和 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. Linux之父访谈录:设计内核只为了好玩

    2010-09-20 10:36 “有 些人生来就具有统率百万人的领袖风范;另一些人则是为写出颠覆世界的软件而生.唯一一个能同时做到这两 者的人,就是Linus Torvalds.”这是美国<时 ...

  2. find命令小结

    find命令小结 find命令用于在系统中查找文件,配合 -exec 选项或 xargs命令还能对查找到得文件执行一些列的自动化操作. 基本格式:find [-H] [-L] [-P] [path.. ...

  3. 关于C语言指针中的p++与p+i

    先看一组代码: #include <stdio.h> void main() { int i,*p,a[7]; p=a; for(i=0;i<7;i++) scanf("% ...

  4. linux 文件在磁盘上的表示

    基本构成 分区就是把磁盘像比萨饼一样切成大小一样的扇形, 当然分区大小不一样扇形的大小也就不一样 上下一串盘片中,相同半径的磁道所组成的一个圆柱型的环壁,就称为柱面 在柱面组中, 比较重要的两个结构是 ...

  5. 金融系列5《AUTH过程》

    INITIALIZE UPDATE: 在安全通道的显式发起期间,INITIALIZEUPDATE命令用于在卡和主机之间传送卡和会话数据.这个命令开始一个安全通道会话的发起. CPURESET() // ...

  6. Jira 6.0.3 安装与破解

    如果你还没有使用Jira做项目跟踪与管理,那就赶紧试用一下吧.下面教你一步一步安装Jira 6.0.3,以及如何破解试用版. 一. 安装准备   1. 去Jira官方网站下载http://www.at ...

  7. Daily Scrum 11.12

    摘要:本次会议继续讨论程序的问题以及单元测试和集成测试,本次测试为终审,并且本次得到的为alpha版本的最终版本.本次的Task列表如下: Task列表 出席人员 Today's Task Tomor ...

  8. CADisplayLink

    什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个r ...

  9. c库函数之scanf

    scanf()函数的原理 想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组. 当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入. ...

  10. 【BZOJ】【2768】【JLOI2010】冠军调查

    网络流/最小割 我不会告诉你这题跟 BZOJ 1934 是一模一样的……包括数据范围…… /****************************************************** ...