剑指 Offer II 001. 整数除法
题目:
思路:
【1】首先是要明确溢出的情况,由于负数的数值是比正数多一位的,所以会存在Integer.MIN_VALUE/-1,这样就会大于Integer.MAX_VALUE
【2】基于暴力破解的思想,可以采用减法替代除法,这样是可以完成题目的要求的,但是还可以采用倍增的方式来加大减数的大小,如-16相当于4次的-4,相当于8次的-2,如果一个数大于16,采用这种方式会更加的快,运算次数也会更少。
代码展示:
class Solution { public int divide(int a, int b) { //边界条件,溢出 if(a == Integer.MIN_VALUE && b == -1){ return Integer.MAX_VALUE; } //记录符号 int sign = (a^b)<0?-1:1; int res = 0; //转为负数,因为负数比正数多1 if (a>0){ a = -a; } if (b>0){ b = -b; } int value = b; int k = 1; while(a <= b) { //普通减法很慢,采用2倍相减 value = b; k = 1; //负数判断;且a < value + value 可能溢出,等式变换 while(a - value < value) { value = value << 1; k = k << 1; } a -= value; res += k; } return sign == 1 ? res : -res; } }