29. Divide Two Integers
2341 ワード
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).
2ブラシの考え方は、divisor、2 divisor、4 divisor、8 divisorをそれぞれ使って試して、dividendより大きい値を見つけます.その後dividendはそれを減算します.このサイクルを繰り返します.ただし、中間値はlong型整数に変換し、Math.absのcorner case:Integer.MIN_VALUEとInteger.MAX_VALUEの値にエラーが発生しました.
If it is overflow, return MAX_INT.
問題解:コアは記号を判断してbit shiftと減算を使用することです.問題を解く過程でいろいろなcorner caseをよく処理しなければならない.例:
divisor=0 dividendまたはdivisor=Integer.MIN_vALUE divisor = Integer.MIN_VALUE
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<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<
2ブラシの考え方は、divisor、2 divisor、4 divisor、8 divisorをそれぞれ使って試して、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;
}
}