package com.interview.books.leetcodeoj; /** * Created_By: stefanie * Date: 14-12-18 * Time: 下午4:47 */ public class LOJ29_DivideTwoInteger { //use minus to do division, check how many divisor, given dividend can minus. //optmized solution is: try to minus most 2^i divisor (can be calculated by left shift). //1.clarify the edge case handling //2.carefully about negative dividend and divisor //3.use long to do the shift calculation to avoid overflow. //4.while condition a >= b //5.shift start from 0 //6.update:a -= b << (shift - 1); and answer += (1 << (shift - 1)); public int divide(int dividend, int divisor) { if(divisor == 1) return dividend; else if(divisor == -1){ if(dividend == Integer.MIN_VALUE) return Integer.MAX_VALUE; else return -dividend; } boolean negative = (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0); long a = Math.abs((long)dividend); long b = Math.abs((long)divisor); int answer = 0; while(a >= b){ int shift = 0; while(a >= (b << shift)) shift++; a -= b << (shift - 1); answer += (1 << (shift - 1)); } return negative? -answer : answer; } public static void main(String[] args){ LOJ29_DivideTwoInteger divider = new LOJ29_DivideTwoInteger(); System.out.println(divider.divide(-2147483648, -1)); } }