File tree 3 files changed +88
-0
lines changed
src/com/blankj/medium/_029
3 files changed +88
-0
lines changed Original file line number Diff line number Diff line change 81
81
| 19 | [ Remove Nth Node From End of List] [ 019 ] | Linked List, Two Pointers |
82
82
| 22 | [ Generate Parentheses] [ 022 ] | String, Backtracking |
83
83
| 24 | [ Swap Nodes in Pairs] [ 024 ] | Linked List |
84
+ | 29 | [ Divide Two Integers] [ 029 ] | Math, Binary Search |
84
85
| 33 | [ Search in Rotated Sorted Array] [ 033 ] | Arrays, Binary Search |
85
86
| 43 | [ Multiply Strings] [ 043 ] | Math, String |
86
87
| 49 | [ Group Anagrams] [ 049 ] | Hash Table, String |
156
157
[ 019 ] : https://github.com/Blankj/awesome-java-leetcode/blob/master/note/019/README.md
157
158
[ 022 ] : https://github.com/Blankj/awesome-java-leetcode/blob/master/note/022/README.md
158
159
[ 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
159
161
[ 033 ] : https://github.com/Blankj/awesome-java-leetcode/blob/master/note/033/README.md
160
162
[ 043 ] : https://github.com/Blankj/awesome-java-leetcode/blob/master/note/043/README.md
161
163
[ 049 ] : https://github.com/Blankj/awesome-java-leetcode/blob/master/note/049/README.md
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments