From 741ea79b41cad3dae0cc0a81f2d901a37a02f906 Mon Sep 17 00:00:00 2001 From: EFanZh Date: Tue, 21 Jan 2025 23:30:00 +0800 Subject: [PATCH] Add problem 2404: Most Frequent Even Element --- src/lib.rs | 1 + .../hash_map.rs | 61 +++++++++++++++++++ .../mod.rs | 26 ++++++++ 3 files changed, 88 insertions(+) create mode 100644 src/problem_2404_most_frequent_even_element/hash_map.rs create mode 100644 src/problem_2404_most_frequent_even_element/mod.rs diff --git a/src/lib.rs b/src/lib.rs index ce23b6b8..b6adaa9a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1790,6 +1790,7 @@ pub mod problem_2399_check_distances_between_same_letters; pub mod problem_2400_number_of_ways_to_reach_a_position_after_exactly_k_steps; pub mod problem_2401_longest_nice_subarray; pub mod problem_2402_meeting_rooms_iii; +pub mod problem_2404_most_frequent_even_element; #[cfg(test)] mod test_utilities; diff --git a/src/problem_2404_most_frequent_even_element/hash_map.rs b/src/problem_2404_most_frequent_even_element/hash_map.rs new file mode 100644 index 00000000..e1a42506 --- /dev/null +++ b/src/problem_2404_most_frequent_even_element/hash_map.rs @@ -0,0 +1,61 @@ +pub struct Solution; + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +use std::cmp::Ordering; +use std::collections::hash_map::Entry; +use std::collections::HashMap; +use std::hash::{BuildHasherDefault, DefaultHasher}; + +impl Solution { + pub fn most_frequent_even(nums: Vec) -> i32 { + let mut frequencies = HashMap::<_, u16, _>::with_hasher(BuildHasherDefault::::default()); + + for num in nums { + if num & 1 == 0 { + match frequencies.entry(num) { + Entry::Occupied(occupied_entry) => *occupied_entry.into_mut() += 1, + Entry::Vacant(vacant_entry) => { + vacant_entry.insert(1); + } + } + } + } + + let mut result = -1; + let mut max_frequency = 0; + + for (&num, &frequency) in &frequencies { + match frequency.cmp(&max_frequency) { + Ordering::Less => {} + Ordering::Equal => { + if num < result { + result = num; + } + } + Ordering::Greater => { + max_frequency = frequency; + result = num; + } + } + } + + result + } +} + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +impl super::Solution for Solution { + fn most_frequent_even(nums: Vec) -> i32 { + Self::most_frequent_even(nums) + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_solution() { + super::super::tests::run::(); + } +} diff --git a/src/problem_2404_most_frequent_even_element/mod.rs b/src/problem_2404_most_frequent_even_element/mod.rs new file mode 100644 index 00000000..1d985a4b --- /dev/null +++ b/src/problem_2404_most_frequent_even_element/mod.rs @@ -0,0 +1,26 @@ +pub mod hash_map; + +pub trait Solution { + fn most_frequent_even(nums: Vec) -> i32; +} + +#[cfg(test)] +mod tests { + use super::Solution; + + pub fn run() { + let test_cases = [ + (&[0, 1, 2, 2, 4, 4, 1] as &[_], 2), + (&[4, 4, 4, 9, 2, 4], 4), + (&[29, 47, 21, 41, 13, 37, 25, 7], -1), + ( + &[8154, 9139, 8194, 3346, 5450, 9190, 133, 8239, 4606, 8671, 8412, 6290], + 3346, + ), + ]; + + for (nums, expected) in test_cases { + assert_eq!(S::most_frequent_even(nums.to_vec()), expected); + } + } +}