From 01c4a4610c48607ee59c98221850a2a10f517851 Mon Sep 17 00:00:00 2001 From: Andranik Date: Tue, 3 Sep 2024 21:37:34 +0400 Subject: [PATCH] add solution of binary_search --- Cargo.lock | 4 +++ Cargo.toml | 4 +++ crates/binary_search/Cargo.toml | 9 ++++++ crates/binary_search/src/lib.rs | 47 ++++++++++++++++++++++++++++ crates/contains_duplicate/src/lib.rs | 1 - crates/is_palindrome/src/lib.rs | 1 - crates/two_sum/src/lib.rs | 2 -- crates/valid_anagram/src/lib.rs | 1 - 8 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 crates/binary_search/Cargo.toml create mode 100644 crates/binary_search/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 80aba77..95f360f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,10 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "binary_search" +version = "0.1.0" + [[package]] name = "contains-duplicate" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index dca366b..b8efaff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,9 +2,13 @@ nursery = { level = "warn", priority = -1 } pedantic = { level = "warn", priority = -1 } needless_pass_by_value = "allow" +cast_possible_truncation = "allow" +cast_possible_wrap = "allow" +must_use_candidate = "allow" [workspace] members = [ + "crates/binary_search", "crates/contains_duplicate", "crates/is_palindrome", "crates/two_sum", diff --git a/crates/binary_search/Cargo.toml b/crates/binary_search/Cargo.toml new file mode 100644 index 0000000..b83cdde --- /dev/null +++ b/crates/binary_search/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "binary_search" +version = "0.1.0" +edition = "2021" + +[dependencies] + +[lints] +workspace = true diff --git a/crates/binary_search/src/lib.rs b/crates/binary_search/src/lib.rs new file mode 100644 index 0000000..e4133ff --- /dev/null +++ b/crates/binary_search/src/lib.rs @@ -0,0 +1,47 @@ +use std::cmp::Ordering; + +pub fn binary_search(nums: Vec, target: i32) -> i32 { + let mut left_pointer = 0; + let mut right_pointer = nums.len(); + + while left_pointer < right_pointer { + let middle = left_pointer + (right_pointer - left_pointer) / 2; + + match target.cmp(&nums[middle]) { + Ordering::Equal => return middle as i32, + Ordering::Less => right_pointer = middle, + Ordering::Greater => left_pointer = middle + 1, + } + } + + -1 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn case_target_in_middle() { + let result = binary_search(vec![1, 3, 5, 7, 9], 5); + assert_eq!(result, 2); + } + + #[test] + fn case_target_in_start() { + let result = binary_search(vec![1, 3, 5, 7, 9, 11], 11); + assert_eq!(result, 5); + } + + #[test] + fn case_target_in_end() { + let result = binary_search(vec![1, 3, 5, 7, 9], 9); + assert_eq!(result, 4); + } + + #[test] + fn case_not_found() { + let result = binary_search(vec![1, 3, 5, 7, 9, 11], 0); + assert_eq!(result, -1); + } +} diff --git a/crates/contains_duplicate/src/lib.rs b/crates/contains_duplicate/src/lib.rs index 522bc7a..760e470 100644 --- a/crates/contains_duplicate/src/lib.rs +++ b/crates/contains_duplicate/src/lib.rs @@ -1,6 +1,5 @@ use std::collections::HashSet; -#[must_use] pub fn contains_duplicate(numbers: Vec) -> bool { let mut set = HashSet::new(); diff --git a/crates/is_palindrome/src/lib.rs b/crates/is_palindrome/src/lib.rs index 0abcd76..6756914 100644 --- a/crates/is_palindrome/src/lib.rs +++ b/crates/is_palindrome/src/lib.rs @@ -1,4 +1,3 @@ -#[must_use] pub fn is_palindrome(s: String) -> bool { if s.trim().is_empty() { return true; diff --git a/crates/two_sum/src/lib.rs b/crates/two_sum/src/lib.rs index 65059cf..a9505b8 100644 --- a/crates/two_sum/src/lib.rs +++ b/crates/two_sum/src/lib.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -#[must_use] pub fn two_sum(nums: Vec, target: i32) -> Vec { let mut map = HashMap::new(); @@ -8,7 +7,6 @@ pub fn two_sum(nums: Vec, target: i32) -> Vec { let diff = target - number; if let Some(&j) = map.get(&diff) { - #[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)] return vec![i as i32, j as i32]; } diff --git a/crates/valid_anagram/src/lib.rs b/crates/valid_anagram/src/lib.rs index cafe7e9..78c4c65 100644 --- a/crates/valid_anagram/src/lib.rs +++ b/crates/valid_anagram/src/lib.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -#[must_use] pub fn is_anagram(s: String, t: String) -> bool { if s.len() != t.len() { return false;