-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsolution.js
69 lines (56 loc) · 1.67 KB
/
solution.js
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function dividePositives(x, y) {
let answer = 0;
let current = 1;
while (y < x) {
let shifted = y << 1;
if (shifted >> 1 !== y) shifted = ~shifted;
y = shifted;
current <<= 1;
}
current >>= 1;
y >>= 1;
while (current > 0) {
if (x >= y) {
x -= y;
answer |= current;
}
current >>= 1;
y >>= 1;
}
return answer;
}
function divide(x, y) {
const intMinValue = -0x80000000;
const intMaxValue = 0x7fffffff;
if (y === 0) return NaN;
if (x === y) return 1;
if (y === 1) return x;
if (x === intMinValue && y === -1) return intMaxValue; // 32 bit overflow
if (y === -1) return -x;
if (x > 0 && y > x) return 0;
if (x < 0 && y < x) return 0;
if (x === intMinValue && y > 0) return NaN;
let isResultNegative = false;
if (x < 0) {
x = -x;
isResultNegative = !isResultNegative;
}
if (y < 0) {
y = -y;
isResultNegative = !isResultNegative;
}
let res = dividePositives(x, y);
if (isResultNegative) res = -res;
return res;
}
console.log(divide(10, 2), 10 / 2); // 5
console.log(divide(10, -2), 10 / -2); // -5
console.log(divide(10, 3), 10 / 3); // 3
console.log(divide(50, 4), 50 / 4); // 12
console.log(divide(-50, 4), -50 / 4); // -12
console.log(divide(171, 3), 171 / 3); // 57
console.log(divide(207, 20), 207 / 20); // 10
console.log(divide(6351, 41), 6351 / 41); // 154
console.log(divide(2147483647, 2), 2147483647 / 2); // 1073741823
console.log(divide(2147483647, 3), 2147483647 / 3); // fail edge case
console.log(divide(-2147483648, 3), 2147483647 / 3); // fail edge case