diff --git a/product_of_array_except_self/Cargo.toml b/product_of_array_except_self/Cargo.toml new file mode 100644 index 0000000..6048c6d --- /dev/null +++ b/product_of_array_except_self/Cargo.toml @@ -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] diff --git a/product_of_array_except_self/src/main.rs b/product_of_array_except_self/src/main.rs new file mode 100644 index 0000000..55bbc70 --- /dev/null +++ b/product_of_array_except_self/src/main.rs @@ -0,0 +1,57 @@ +struct Solution; + +enum Zeros { + None, + One(usize), + Many, +} + +impl Solution { + pub fn product_except_self(nums: Vec) -> Vec { + 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!"); +}