博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lintcode 中等题:Divide Two Integers 两个数的除法
阅读量:6637 次
发布时间:2019-06-25

本文共 4259 字,大约阅读时间需要 14 分钟。

题目

将两个整数相除,要求不使用乘法、除法和 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<
<= 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

 

 

 

转载地址:http://seivo.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
Maven学习总结(七)——eclipse中使用Maven创建Web项目
查看>>
JEESZ分布式框架简介
查看>>
学科前沿技术作业二(下)
查看>>
tar
查看>>
vsftpd服务
查看>>
一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建输出验证码图片的控制器...
查看>>
UITextView实现占位文字的两种方法
查看>>
问题MySQL server has gone away
查看>>
SpriteKit-SKView
查看>>
Log4j 配置文件(log4j.properties)的所在路径问题(转)
查看>>
柜子和托的取值
查看>>
oracle 创建表加双引号作用
查看>>
SpringMvc流程分析,简单源码分析
查看>>
java+hadoop+spark+hbase+scala+kafka+zookeeper配置环境变量记录备忘
查看>>
7.23
查看>>
Ajax
查看>>
leetcode-179-Largest Number(理解规则,自定义cmp函数进行排序)
查看>>
Python: filter
查看>>
[CodeWars][JS]实现链式加法
查看>>