每天都要督促自己做面试题!
题意:
将两个整数相除,要求不使用乘法、除法和 mod 运算符。
如果溢出,返回 2147483647 。
样例:
给定被除数 = 100 ,除数 = 9,返回 11。
这个题说实话,如果直接除以的话,不难的,但是题上说了不能使用乘法和除法,所以只有使用加减法,但是加减法有太慢了,所以想到了位运算,<<1表示左移一位,表示乘以2。
1.解题思路
我们将被除数循环减去除数(这个是要变得),减过一次,如果被除数>=除数的话,就让除数乘以2(<<1),并且增量也要乘以2,因为倍数原来的两倍。
我们假设,result 用来记录最终的结果,cnt表示每次的增量,temp表示变换的除数,每次被除数减去temp之后,cnt<<1,同时temp<<1。
说的我都有点乱了,直接看代码
2.代码
public int divide(int dividend, int divisor) {
if(divisor == 0) {
return 2147483647;
}
long result = 0;
long d1 = Math.abs((long)dividend);
long d2 = Math.abs((long)divisor);
while(d1 >= d2) {
long temp = d2; //变换的除数
long cnt = 1; //增量
while(d1 >= temp) {
//如果被除数大于等于temp(变换的除数),result += cnt
result += cnt;
d1 -= temp; //被除数减去除数
cnt = cnt << 1;
temp = temp << 1;
}
}
if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0) {
result = -result;
}
if(result < Integer.MIN_VALUE || result > Integer.MAX_VALUE) {
result = 2147483647;
}
return (int) result;
}