Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c248a80

Browse filesBrowse files
committed
add: 029
1 parent f70ee47 commit c248a80
Copy full SHA for c248a80

File tree

3 files changed

+88
-0
lines changed
Filter options

3 files changed

+88
-0
lines changed

‎README.md

Copy file name to clipboardExpand all lines: README.md
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
| 19 | [Remove Nth Node From End of List][019] | Linked List, Two Pointers |
8282
| 22 | [Generate Parentheses][022] | String, Backtracking |
8383
| 24 | [Swap Nodes in Pairs][024] | Linked List |
84+
| 29 | [Divide Two Integers][029] | Math, Binary Search |
8485
| 33 | [Search in Rotated Sorted Array][033] | Arrays, Binary Search |
8586
| 43 | [Multiply Strings][043] | Math, String |
8687
| 49 | [Group Anagrams][049] | Hash Table, String |
@@ -156,6 +157,7 @@
156157
[019]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/019/README.md
157158
[022]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/022/README.md
158159
[024]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/024/README.md
160+
[029]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/029/README.md
159161
[033]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/033/README.md
160162
[043]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/043/README.md
161163
[049]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/049/README.md

‎note/029/README.md

Copy file name to clipboard
+51Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# [Divide Two Integers][title]
2+
3+
## Description
4+
5+
Divide two integers without using multiplication, division and mod operator.
6+
7+
If it is overflow, return MAX_INT.
8+
9+
**Tags:** Math, Binary Search
10+
11+
12+
## 思路
13+
14+
题意是让你算两个整型数相除后的结果,如果结果溢出就返回 `MAX_INT`,但不能使用乘、除、余的操作符,如果是用加减操作符的话肯定会超时哈,这样的话我们就只能想到位操作符了。
15+
16+
首先,我们分析下溢出的情况,也就是当被除数为 `Integer.MIN_VALUE`,除数为 `-1` 时会溢出,因为 `|Integer.MIN_VALUE| = Integer.MAX_VALUE + 1`
17+
18+
然后,我们把除数和被除数都转为 `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`,根据以上思路来书写如下代码应该不是难事了吧。
19+
20+
```java
21+
class Solution {
22+
public int divide(int dividend, int divisor) {
23+
if (dividend == Integer.MIN_VALUE && divisor == -1) {
24+
return Integer.MAX_VALUE;
25+
}
26+
long dvd = Math.abs((long) dividend);
27+
long dvr = Math.abs((long) divisor);
28+
int res = 0;
29+
while (dvd >= dvr) {
30+
long temp = dvr, multiple = 1;
31+
while (dvd >= temp << 1) {
32+
temp <<= 1;
33+
multiple <<= 1;
34+
}
35+
dvd -= temp;
36+
res += multiple;
37+
}
38+
return (dividend < 0) ^ (divisor < 0) ? -res : res;
39+
}
40+
}
41+
```
42+
43+
44+
## 结语
45+
46+
如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl]
47+
48+
49+
50+
[title]: https://leetcode.com/problems/divide-two-integers
51+
[ajl]: https://github.com/Blankj/awesome-java-leetcode
+35Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.blankj.medium._029;
2+
3+
/**
4+
* <pre>
5+
* author: Blankj
6+
* blog : http://blankj.com
7+
* time : 2018/01/31
8+
* desc :
9+
* </pre>
10+
*/
11+
public class Solution {
12+
public int divide(int dividend, int divisor) {
13+
if (dividend == Integer.MIN_VALUE && divisor == -1) {
14+
return Integer.MAX_VALUE;
15+
}
16+
long dvd = Math.abs((long) dividend);
17+
long dvr = Math.abs((long) divisor);
18+
int res = 0;
19+
while (dvd >= dvr) {
20+
long temp = dvr, multiple = 1;
21+
while (dvd >= temp << 1) {
22+
temp <<= 1;
23+
multiple <<= 1;
24+
}
25+
dvd -= temp;
26+
res += multiple;
27+
}
28+
return (dividend < 0) ^ (divisor < 0) ? -res : res;
29+
}
30+
31+
public static void main(String[] args) {
32+
Solution solution = new Solution();
33+
System.out.println(solution.divide(-2147483648, 1));
34+
}
35+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.