博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lintcode414- Divide Two Integers- medium ※
阅读量:5149 次
发布时间:2019-06-13

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

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return 2147483647

 

Example

Given dividend = 100 and divisor = 9, return 11.

 

基本思想就是把除数向左移位(×2)然后与被除数比较,直到发现恰好仅次于被除数的那个值,减去该值后递归继续。

除法的答案就是每次得到shift位移后把1向左移位同样的距离,加起来。(除数向左移位,相当于(除数*1)向左移位,相当于除数*(1向左移位))。

1.这题细节非常多,主要在正负计算,计算过程int越界,答案本身int越界,除数为0的问题。数值处理的题目这几个都很重要。

2.处理越界一个简单的方法是转化为long来计算,切记这个常用方法!不过这道题最负数和-1还是不能这样解决,因为最后输出定死了int,所以这个case不能解决,要if做。

3.negative的处理学学样例,isNegative是布尔类型,直接赋值即可不要if。最后返回的时候可以用?符号来简单处理。

4.int 转 long得这样写:long a = Math.abs((long)dividend); 里面的long不加的话 -2...8会变不了正的,因为Math.abs(int)函数当输入-2...8时输出-2...8。

5. << 优先级比 <, == 高,所以可以写divisor << shift < dividend 这种。

 

样例代码:

/**     * 本参考程序来自九章算法,由 @九章算法 提供。版权所有,转发请注明出处。     * - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。     * - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,     * - Big Data 项目实战班,算法面试高频题班, 动态规划专题班     * - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code     */ public class Solution {    /**     * @param dividend the dividend     * @param divisor the divisor     * @return the result     */    public int divide(int dividend, int divisor) {        if (divisor == 0) {             return dividend >= 0? Integer.MAX_VALUE : Integer.MIN_VALUE;        }                if (dividend == 0) {            return 0;        }                if (dividend == Integer.MIN_VALUE && divisor == -1) {            return Integer.MAX_VALUE;        }                boolean isNegative = (dividend < 0 && divisor > 0) ||                              (dividend > 0 && divisor < 0);                                     long a = Math.abs((long)dividend);        long b = Math.abs((long)divisor);        int result = 0;        while(a >= b){            int shift = 0;            while(a >= (b << shift)){                shift++;            }            a -= b << (shift - 1);            result += 1 << (shift - 1);        }        return isNegative? -result: result;    }}

 

自己写的:

public class Solution {    /*     * @param dividend: the dividend     * @param divisor: the divisor     * @return: the result     */    public int divide(int dividend, int divisor) {        // !!!处理溢出        if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1){            return Integer.MAX_VALUE;        }                if (dividend == Integer.MIN_VALUE && divisor == 1){            return Integer.MIN_VALUE;        }        // !!!处理负数        boolean isNegative = false;        if (dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0){            isNegative = true;        }        long dividendL = Math.abs((long)dividend);        long divisorL = Math.abs((long)divisor);                int result = 0;        long sum = 0;        int currentIdx = findIdx(dividendL, divisorL);        while (currentIdx >= 0){            result += 1 << currentIdx;            sum += divisorL << currentIdx;            currentIdx = findIdx(dividendL - sum, divisorL);        }        return isNegative? -result : result;    }    // return the exact index n so divisor * 2^n <= dividend < divisor * 2^(n + 1).    // if dividend < divisor, return -1.    private int findIdx(long dividend, long divisor){        int index = 0;        while ((divisor << index) <= dividend){            index++;        }        index--;        return index;    }}

 

转载于:https://www.cnblogs.com/jasminemzy/p/7594791.html

你可能感兴趣的文章
国家地区域名
查看>>
2018/3/26 省选模拟赛 60分
查看>>
201521123060 《Java程序设计》第5周学习总结
查看>>
Linux驱动程序学习备忘之六
查看>>
使用 Unity(二):配置 Unity 、读取配置信息和获取对象
查看>>
导出数据库中所有的对象到指定的目录bcp xp_cmdshell
查看>>
LNMP环境搭建
查看>>
你应该掌握的四种参数估计技术
查看>>
【计算机】DMA原理1
查看>>
百度前端学院-基础学院-第20到21天
查看>>
c#之冒泡排序的三种实现和性能分析
查看>>
订单删除,增加订单,巩固表单特定用法
查看>>
Linux命令之---nl
查看>>
nginx + uwsgi 跑python应用
查看>>
asp.net通过基类实现统一脚本和样式的管理
查看>>
『转』Bitdefender Internet Security 2013 – 免费1年
查看>>
pytorch搭建神经网络-第一篇博客
查看>>
Sublime Text 3 快捷键总结(拿走)
查看>>
return,break与continue的区别
查看>>
快排的递归和非递归C++
查看>>