File tree Expand file tree Collapse file tree 3 files changed +88
-0
lines changed
src/com/blankj/medium/_029 Expand file tree Collapse file tree 3 files changed +88
-0
lines changed Original file line number Diff line number Diff line change 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 |
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
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