这道题思路比较简单,但是力扣归为中等肯定有点小陷阱的
不让用乘、除和mod运算那就减法呗,反正除法的思想也就是减法
public static int divide(int dividend, int divisor) {
if(dividend == Integer.MIN_VALUE && divisor==-1){//溢出时直接返回最大值
return Integer.MAX_VALUE;
}
int sine = (dividend>0)^(divisor>0)?-1:1;//符号标志
if(dividend>0){//这里都转成负数,因为int类型的最小值转为整数会越界溢出
dividend = -dividend;
}
if(divisor>0){
divisor = -divisor;
}
int res = 0;
while (dividend<=divisor){
dividend -= divisor;
res++;
}
return sine==1?res:-res;
}
这道题的陷阱就在边界溢出的问题,刚开始我考虑到了但是没考虑全。。。。。。
题目要求了32位有符号数最小值是-2^32,最大值是2^32-1,最小值的绝对值要比最大值大1,所以如果用最小值除以-1就是就是2^32,但是这就溢出了,所以要对这个情况单独处理,于是有了开头的那个if
if(dividend == Integer.MIN_VALUE && divisor==-1){//溢出时直接返回最大值
return Integer.MAX_VALUE;
}
然后看这个:
if(dividend>0){//这里都转成负数,因为int类型的最小值转为整数会越界溢出
dividend = -dividend;
}
if(divisor>0){
divisor = -divisor;
}
这里是将被除数和除数转为符号相同的数字,我这里是将整数转为负数处理,那么可以都转为整数吗?
不可以。。。
因为如果负数取最小值,绝对值又溢出了
最后结果根据开始的那个疑惑运算结果来判断返回整数还是负数即可