From e71ee718ddd51a6374be95886eed584f1d3ef9ca Mon Sep 17 00:00:00 2001 From: EFanZh Date: Tue, 21 Nov 2023 22:08:38 +0800 Subject: [PATCH] Add problem 1968: Array With Elements Not Equal to Average of Neighbors --- src/lib.rs | 1 + .../iterative.rs | 42 +++++++++++++++++++ .../mod.rs | 34 +++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/iterative.rs create mode 100644 src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/mod.rs diff --git a/src/lib.rs b/src/lib.rs index 5f94bb49..bf769b5b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1363,6 +1363,7 @@ pub mod problem_1957_delete_characters_to_make_fancy_string; pub mod problem_1961_check_if_string_is_a_prefix_of_array; pub mod problem_1962_remove_stones_to_minimize_the_total; pub mod problem_1967_number_of_strings_that_appear_as_substrings_in_word; +pub mod problem_1968_array_with_elements_not_equal_to_average_of_neighbors; #[cfg(test)] mod test_utilities; diff --git a/src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/iterative.rs b/src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/iterative.rs new file mode 100644 index 00000000..3728a44b --- /dev/null +++ b/src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/iterative.rs @@ -0,0 +1,42 @@ +pub struct Solution; + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +use std::mem; + +impl Solution { + pub fn rearrange_array(nums: Vec) -> Vec { + let mut nums = nums; + let mut iter = nums.iter_mut(); + let prev_1 = iter.next().unwrap(); + let mut prev_2 = iter.next().unwrap(); + let mut is_decreasing = prev_2 < prev_1; + + for value in iter { + if is_decreasing == (value < prev_2) { + mem::swap(prev_2, value); + } + + prev_2 = value; + is_decreasing = !is_decreasing; + } + + nums + } +} + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +impl super::Solution for Solution { + fn rearrange_array(nums: Vec) -> Vec { + Self::rearrange_array(nums) + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_solution() { + super::super::tests::run::(); + } +} diff --git a/src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/mod.rs b/src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/mod.rs new file mode 100644 index 00000000..43c173a3 --- /dev/null +++ b/src/problem_1968_array_with_elements_not_equal_to_average_of_neighbors/mod.rs @@ -0,0 +1,34 @@ +pub mod iterative; + +pub trait Solution { + fn rearrange_array(nums: Vec) -> Vec; +} + +#[cfg(test)] +mod tests { + use super::Solution; + use crate::test_utilities; + + pub fn run() { + let test_cases = [&[1, 2, 3, 4, 5] as &[_], &[6, 2, 0, 9, 7]]; + + for nums in test_cases { + let result = S::rearrange_array(nums.to_vec()); + + assert_eq!( + test_utilities::unstable_sorted(result.iter().copied()), + test_utilities::unstable_sorted(nums.iter().copied()), + ); + + let mut prev_1 = i32::MIN; + let mut prev_2 = i32::MIN; + + for value in result { + assert_ne!(prev_1 + value, prev_2 << 1); + + prev_1 = prev_2; + prev_2 = value; + } + } + } +}