LeetCode-Divide Two Integers

https://leetcode-cn.com/problems/divide-two-integers/

用最简单的算法——直接一个一个去减,结果是不出意外的超时了。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
func divide(dividend int, divisor int) int {
var isPositive bool=true
if dividend<0{
dividend=-dividend
isPositive=!isPositive
}
if divisor<0{
divisor=-divisor
isPositive=!isPositive
}
var output int32=0
const INT_MAX = int32(^uint32(0) >> 1)
for dividend>=divisor{
if isPositive{
if output>INT_MAX-1{
break
}
}else{
if output<^INT_MAX+1{
break
}
}
dividend-=divisor
output++
}
if isPositive{
return int(output)
}else{
return int(-output)
}
}

改进了一下算法,增加了一个类似 TCP 的慢启动过程,让速度快了很多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
func divide(dividend int, divisor int) int {
var isPositive bool=true
if dividend<0{
dividend=-dividend
isPositive=!isPositive
}
if divisor<0{
divisor=-divisor
isPositive=!isPositive
}
if dividend<divisor{
return 0
}
var output int32=0
const INT_MAX = int32(^uint32(0) >> 1)
for dividend>=divisor{
if isPositive{
if output>INT_MAX-1{
break
}
}else{
if output<^INT_MAX+1{
break
}
}
var pow int32=1
myDivisor:=divisor
for t:=dividend-myDivisor;t>=0;t=dividend-myDivisor{
dividend=t
output+=pow
myDivisor+=myDivisor
pow+=pow
}
}
if isPositive{
return int(output)
}else{
return int(-output)
}
}

还可以把加法改成移位,参考了一个 Discuss 中的描述。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
func divide(dividend int, divisor int) int {
var isPositive bool=true
if dividend<0{
dividend=-dividend
isPositive=!isPositive
}
if divisor<0{
divisor=-divisor
isPositive=!isPositive
}
if dividend<divisor{
return 0
}
var output int32=0
const INT_MAX = int32(^uint32(0) >> 1)
for dividend>=divisor{
if isPositive{
if output>INT_MAX-1{
break
}
}else{
if output<^INT_MAX+1{
break
}
}
var pow int32=1
myDivisor:=divisor
for t:=dividend-myDivisor;t>=0;t=dividend-myDivisor{
dividend=t
output+=pow
myDivisor<<=1
pow<<=1
}
}
if isPositive{
return int(output)
}else{
return int(-output)
}
}

还有一种比较顺畅的思路是将除数先不断左移,直到刚好比被除数小,然后做一次减法,接着就是将除数不断右移,一旦比除数小,就再用被除数减去除数,直到除数右移为0,运算结束。可以参考这里https://leetcode-cn.com/problems/divide-two-integers/solution/xiao-xue-sheng-du-hui-de-lie-shu-shi-suan-chu-fa-b/