Skip to content

Commit ae39bc3

Browse files
author
Zhang Xiaodong
committed
solve 29
1 parent 5611444 commit ae39bc3

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

src/solution/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ mod s0025_reverse_nodes_in_k_group;
2424
mod s0026_remove_duplicates_from_sorted_array;
2525
mod s0027_remove_element;
2626
mod s0028_find_the_index_of_the_first_occurrence_in_a_string;
27+
mod s0029_divide_two_integers;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
* [29] 两数相除
3+
*
4+
* 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。
5+
* 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。
6+
* 返回被除数 dividend 除以除数 divisor 得到的 商 。
7+
* 注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。本题中,如果商 严格大于 2^31 − 1 ,则返回 2^31 − 1 ;如果商 严格小于 -2^31 ,则返回 -2^31^ 。
8+
*
9+
* 示例 1:
10+
*
11+
* 输入: dividend = 10, divisor = 3
12+
* 输出: 3
13+
* 解释: 10/3 = 3.33333.. ,向零截断后得到 3 。
14+
* 示例 2:
15+
*
16+
* 输入: dividend = 7, divisor = -3
17+
* 输出: -2
18+
* 解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。
19+
*
20+
* 提示:
21+
*
22+
* -2^31 <= dividend, divisor <= 2^31 - 1
23+
* divisor != 0
24+
*
25+
*/
26+
pub struct Solution {}
27+
28+
// problem: https://leetcode.cn/problems/divide-two-integers/
29+
// discuss: https://leetcode.cn/problems/divide-two-integers/discuss/?currentPage=1&orderBy=most_votes&query=
30+
31+
// submission codes start here
32+
33+
impl Solution {
34+
fn rectify(i: i32) -> u32 {
35+
if i == std::i32::MIN {
36+
return i as u32
37+
} else if i < 0 {
38+
return -i as u32
39+
} else {
40+
return i as u32
41+
}
42+
}
43+
44+
pub fn divide(dividend: i32, divisor: i32) -> i32 {
45+
if dividend == i32::MIN && divisor == 1 {
46+
return i32::MIN
47+
}
48+
49+
let mut a = Self::rectify(dividend);
50+
let b = Self::rectify(divisor);
51+
52+
let mut m = 0;
53+
let mut res = 0;
54+
let magic = 0x80000000u32;
55+
for _ in 0..32{
56+
res = res << 1;
57+
m = m << 1;
58+
if a & magic > 0 {
59+
m += 1;
60+
}
61+
a <<= 1;
62+
if m >= b {
63+
res += 1;
64+
m -= b;
65+
}
66+
}
67+
if (res == i32::MIN) {
68+
return i32::MAX
69+
} else if (dividend < 0 && divisor < 0) || (dividend > 0 && divisor > 0) {
70+
return res;
71+
} else {
72+
return -res;
73+
}
74+
}
75+
}
76+
77+
// submission codes end
78+
79+
#[cfg(test)]
80+
mod tests {
81+
use super::*;
82+
83+
#[test]
84+
fn test_29() {
85+
assert_eq!(Solution::divide(9, 2), 4);
86+
assert_eq!(Solution::divide(-9, 2), -4);
87+
assert_eq!(Solution::divide(i32::MIN, i32::MIN), 1);
88+
assert_eq!(Solution::divide(i32::MAX, i32::MAX), 1);
89+
assert_eq!(Solution::divide(i32::MIN, -1), i32::MAX);
90+
assert_eq!(Solution::divide(i32::MIN, 1), i32::MIN);
91+
assert_eq!(Solution::divide(7, -3), -2);
92+
assert_eq!(Solution::divide(10, 3), 3);
93+
assert_eq!(Solution::divide(-1, 7), 0);
94+
}
95+
}

0 commit comments

Comments
 (0)