some more problems
This commit is contained in:
31
divide-two-integers/sol.rs
Normal file
31
divide-two-integers/sol.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
// Assume shift operators are allowed
|
||||
impl Solution {
|
||||
#[inline]
|
||||
pub fn negative(n: i32) -> i32 {
|
||||
if n.is_positive() {
|
||||
return !(n - 1);
|
||||
}
|
||||
n
|
||||
}
|
||||
pub fn divide(dividend: i32, divisor: i32) -> i32 {
|
||||
let positive = dividend ^ divisor >= 0;
|
||||
let negative_divisor = Solution::negative(divisor);
|
||||
let negative_answer = (0..negative_divisor.leading_ones()) // Preform all arithmetic in negative because of larger available range of numbers
|
||||
.rev() // Reverse to get most extreme subdivisor first
|
||||
.map(|n| negative_divisor << n) // Generate subdivisors
|
||||
.fold((0, Solution::negative(dividend)), |(quotient, carry), subdivisor| {
|
||||
if subdivisor >= carry {
|
||||
return ((quotient << 1) - 1, carry - subdivisor);
|
||||
}
|
||||
return (quotient << 1, carry);
|
||||
}).0;
|
||||
if positive {
|
||||
let answer = !negative_answer;
|
||||
if answer != std::i32::MAX {
|
||||
return answer + 1;
|
||||
}
|
||||
return answer;
|
||||
}
|
||||
negative_answer
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user