29. Divide Two Integers

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

If it is overflow, return MAX_INT.

一刷
题解:
核心是判断符号后使用bit shift以及减法。做题过程中要仔细处理各种corner case。比如:

divisor = 0
  dividend 或者 divisor = Integer.MIN_vALUE
divisor = Integer.MIN_VALUE

  • if dividend = Integer.MIN_VALUE, return 1
    return 0
    dividend = Integer.MIN_VALUE
  • if divisor = -1, return Integer.MAX_VALUE
  • if divisor > 0, set divisor = - divisor - calculate everything in the range of negative int
    Time Complexity - O(1), Space Complexity - O(1)。
public class Solution {
    public int divide(int dividend, int divisor) {
        if(divisor == 0) return Integer.MAX_VALUE;
        if(dividend == 0) return 0;
        boolean hasSameSign = (divisor>0) ^ (dividend<0);
        int res = 0;
        if(divisor != Integer.MIN_VALUE && dividend != Integer.MIN_VALUE){
            divisor = Math.abs(divisor);
            dividend = Math.abs(dividend);
            for(int i=0; i<32; i++){//can be extended to binarysearch
                if((dividend>>(31 - i)) >=divisor){
                    dividend -= (divisor<<(31 - i));
                    res += 1<<(31 - i);
                }
            }
        }
        else{
            if(divisor == Integer.MIN_VALUE) return dividend == Integer.MIN_VALUE? 1:0;
            if(divisor == -1) return Integer.MAX_VALUE;
            if(divisor >0) divisor = -divisor; // dividend == Integer.MIN_VALUE
            for(int i=0; i<32; i++){//can be extended to binarysearch
                if((dividend>>(31 - i)) <=divisor){
                    dividend -= (divisor<<(31 - i));
                    res += 1<<(31 - i);
                }
            }
        }
        return hasSameSign? res: -res;
    }
}

二刷
思路就是分别用divisor, 2divisor, 4divisor, 8divisor去试,然后找到一个最大的但是小于dividend的值。然后dividend减去它。重复该循环。注意,中间值要转成long型整数,避免Math.abs时对于corner case: Integer.MIN_VALUE和Integer.MAX_VALUE的值出现错误。

public class Solution {
    public int divide(int dividend, int divisor) {
        if(divisor==0 || (dividend == Integer.MIN_VALUE && divisor == -1)) return Integer.MAX_VALUE;
        int sign = ((dividend<0) ^ (divisor<0))? -1:1;
        long dvd = Math.abs((long)dividend);
        long dvs = Math.abs((long)divisor);
        long res = 0;
        while(dvd>=dvs){
            long temp = dvs, multiple = 1;
            while(dvd>=(temp<<1)){
                temp <<=1;
                multiple <<= 1;
            }
            dvd -= temp;
            res += multiple;
        }
        return sign==1? (int)res : (int)-res;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,778评论 0 33
  • Divide two integers without using multiplication, divisio...
    xxx亦凡桑阅读 1,122评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • Divide two integers without using multiplication, divisio...
    matrxyz阅读 392评论 0 0
  • 望铭记大学校园,你的欢笑;愿想起火车车站,和你相拥。青葱岁月,尽情度过得到的却是无情的分别。 只记得南京路上,你的...
    箫然阅读 77评论 0 0