标签:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题目的意思就是:不使用*、/、%运算符进行除法运算
这道题最直接的想法,就是被除数每次减去除数,计算减了多少次,即为所求。但是这个办法的效率太低,试想被除数是Integer.MAX_VALUE(2147483647),除数是1,则要减2147483647次,很明显会发生TLE。
更好的方法:
不是每次减去除数,而是每次减后除数*2,结果每次累加除数的相应的倍数。
public class P029_DivideTwoIntegers {public int divide(int dividend, int divisor) {int sign = 1;if (dividend < 0) {sign = -sign;}if (divisor < 0) {sign = -sign;}long n1 = Math.abs((long)dividend);long n2 = Math.abs((long)divisor);long ans = 0;//用long是为了处理溢出,比如当ans为2147483648的情况while (n1 >= n2) {long base = n2;for (int i = 0; n1 >= base; i++) {n1 -= base;base<<=1;ans+=1<<i;}}//处理溢出的情况//int的范围为-2147483648到2147483647//dividend=Integer.MIN_VALUE,即-2147483648//divisor=-1,此时将发生溢出,按题目要求,返回Integer.MAX_VALUEif (ans * sign > Integer.MAX_VALUE)return Integer.MAX_VALUE;return (int) (sign*ans);}}
【LeetCode】P029_DivideTwoIntegers
标签:
原文地址:http://www.cnblogs.com/yeyang/p/4788292.html