# [Divide Two Integers][title] ## Description Given two integers `dividend` and `divisor`, divide two integers without using multiplication, division and mod operator. Return the quotient after dividing `dividend` by `divisor`. The integer division should truncate toward zero. **Example 1:** ``` Input: dividend = 10, divisor = 3 Output: 3 ``` **Example 2:** ``` Input: dividend = 7, divisor = -3 Output: -2 ``` **Note:** - Both dividend and divisor will be 32-bit signed integers. - The divisor will never be 0. - Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows. **Tags:** Math, Binary Search ## 思路 题意是让你算两个整型数相除后的结果,如果结果溢出就返回 `MAX_INT`,但不能使用乘、除、余的操作符,如果是用加减操作符的话肯定会超时哈,这样的话我们就只能想到位操作符了。 首先,我们分析下溢出的情况,也就是当被除数为 `Integer.MIN_VALUE`,除数为 `-1` 时会溢出,因为 `|Integer.MIN_VALUE| = Integer.MAX_VALUE + 1`。 然后,我们把除数和被除数都转为 `long` 类型的正数去做下一步操作,我这里以 `22` 和 `3` 相除为例子,因为 `22 >= 3`,我们对 `3` 进行左移一位,也就是乘 2,结果为 `6`,比 `22` 小,我们继续对 `6` 左移一位结果为 `12`,还是比 `22` 小,我们继续对 `12` 左移一位为 `24`,比 `22` 大,这时我们可以分析出,`22` 肯定比 `3` 的 `4` 倍要大,`4` 是怎么来的?因为我们左移了两次,也就是 `1 << 2 = 4`,此时我们记下这个 `4`,然后让 `22 - 3 * 4 = 10`,因为 `10 >= 3`,对 `10` 和 `3` 进行同样的操作,我们可以得到 `2`,此时加上上次的 `4`,和为 `6`,也就是 `22` 比 `3` 的 `6` 倍要大,此时还剩余 `10 - 6 = 4`,因为 `4 >= 3`,所以对 `4` 和 `3` 进行同样的操作,我们发现并不能对 `3` 进行左移了,因为 `4 >= 3`,所以 `1` 倍还是有的,所以加上最后的 `1`,结果为 `6 + 1 = 7`,也就是 `22` 整除 `3` 结果为 `7`。 最终,我们对结果赋予符号位即可,根据以上思路来书写如下代码应该不是难事了吧。 ```java class Solution { public int divide(int dividend, int divisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) { return Integer.MAX_VALUE; } long dvd = Math.abs((long) dividend); long dvr = Math.abs((long) divisor); int res = 0; while (dvd >= dvr) { long temp = dvr, multiple = 1; while (dvd >= temp << 1) { temp <<= 1; multiple <<= 1; } dvd -= temp; res += multiple; } return (dividend < 0) ^ (divisor < 0) ? -res : res; } } ``` ## 结语 如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl] [title]: https://leetcode.com/problems/divide-two-integers [ajl]: https://github.com/Blankj/awesome-java-leetcode