add "product of array except self" in rust
This commit is contained in:
parent
db142ff1df
commit
34db36cf0b
2 changed files with 65 additions and 0 deletions
8
product_of_array_except_self/Cargo.toml
Normal file
8
product_of_array_except_self/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "product_of_array_except_self"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
57
product_of_array_except_self/src/main.rs
Normal file
57
product_of_array_except_self/src/main.rs
Normal file
|
@ -0,0 +1,57 @@
|
|||
struct Solution;
|
||||
|
||||
enum Zeros {
|
||||
None,
|
||||
One(usize),
|
||||
Many,
|
||||
}
|
||||
|
||||
impl Solution {
|
||||
pub fn product_except_self(nums: Vec<i32>) -> Vec<i32> {
|
||||
let mut out = vec![0i32; nums.len()];
|
||||
let nums = nums.as_slice();
|
||||
let zeros = count_zeros(nums);
|
||||
|
||||
match zeros {
|
||||
Zeros::None => {
|
||||
let prod: i32 = nums.iter().product();
|
||||
for (i, x) in nums.iter().enumerate() {
|
||||
out[i] = prod / x;
|
||||
}
|
||||
}
|
||||
Zeros::One(z) => {
|
||||
let left = if z == 0 {
|
||||
1
|
||||
} else {
|
||||
nums[0..z].iter().product()
|
||||
};
|
||||
let right = if z == nums.len() - 1 {
|
||||
1
|
||||
} else {
|
||||
nums[(z + 1)..].iter().product()
|
||||
};
|
||||
out[z] = left * right;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
out
|
||||
}
|
||||
}
|
||||
|
||||
fn count_zeros(nums: &[i32]) -> Zeros {
|
||||
let mut zeros = std::collections::HashSet::new();
|
||||
for (i, n) in nums.iter().enumerate() {
|
||||
if *n == 0i32 {
|
||||
zeros.insert(i);
|
||||
}
|
||||
}
|
||||
match zeros.len() {
|
||||
0 => Zeros::None,
|
||||
1 => Zeros::One(*zeros.iter().next().unwrap()),
|
||||
_ => Zeros::Many,
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
Loading…
Reference in a new issue