Leetcode #29 Divide Two Integers 整数相除 解题报告

这篇博客详细介绍了如何在不使用乘法、除法和模运算符的情况下解决LeetCode上的第29题——整数相除。博主提出了解题思路,即避免溢出并转换为二进制运算,但由于时间紧迫,没有深入展开,提供了AC(Accepted)解法的提示。
摘要由CSDN通过智能技术生成

1 解题思想

就是两个整数相除,不能使用内置的运算,如果溢出那么久返回最大的整数

2 原题

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

If it is overflow, return MAX_INT.
题目需要拆解成一个基数为2的。请看我代码里面的那个连接

今天好忙来不及仔细说了,见谅

3 AC解

public class Solution {
    /**
     * http://www.tuicool.com/articles/FNrUvyE
     * 具体解析请看上面那个
     * 可以拆解成2为基数的哪一个,值得学习!
     * */
    public int divide(int dividend, int divisor) {
        if(divisor==0)
            return Integer.MAX_VALUE;
        //注意这里做强制转换,给定了abs时调用的仍然是int,遇到负无穷会溢出,所以提前转换成long,注意括号内外都要转
        long a=Math.abs(dividend+0l),b=Math.abs(divisor+0l);
       // System.out.println(a+" "+b);
        if(b>a)
            return 0;
        long count=0,times=0;
        while(b<<1 <= a){
            b<<=1;
            times++;
        }
        while(times>=0){
         //   System.out.println(a+" "+b+" "+count);
            if(a>=b){
                count+=1<<times;
                a-=b;
            }
            b>>=1;
            times--;
        }
        if((dividend^divisor)>>>31==1){
            return (int)-count;
        }
        else{
            //负数的绝对值比正数多一位,特别小心!!!
            int tmp=(int)count;
            if(tmp<0)
                return Integer.MAX_VALUE;
            else return tmp;
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值