diff --git a/Cargo.lock b/Cargo.lock index e7a218e..a252cd3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,10 @@ version = 3 name = "contains-duplicate" version = "0.1.0" +[[package]] +name = "two_sum" +version = "0.1.0" + [[package]] name = "valid_anagram" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 6aa60b8..f749b8a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,5 +3,9 @@ pedantic = "warn" nursery = "warn" [workspace] -members = ["crates/contains_duplicate", "crates/valid_anagram"] +members = [ + "crates/contains_duplicate", + "crates/two_sum", + "crates/valid_anagram", +] resolver = "2" diff --git a/crates/two_sum/Cargo.toml b/crates/two_sum/Cargo.toml new file mode 100644 index 0000000..0b0bd5c --- /dev/null +++ b/crates/two_sum/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "two_sum" +version = "0.1.0" +edition = "2021" + +[dependencies] + +[lints] +workspace = true diff --git a/crates/two_sum/src/lib.rs b/crates/two_sum/src/lib.rs new file mode 100644 index 0000000..65059cf --- /dev/null +++ b/crates/two_sum/src/lib.rs @@ -0,0 +1,42 @@ +use std::collections::HashMap; + +#[must_use] +pub fn two_sum(nums: Vec, target: i32) -> Vec { + let mut map = HashMap::new(); + + for (i, number) in nums.into_iter().enumerate() { + 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]; + } + + map.insert(number, i); + } + + unreachable!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn case_1() { + let result = two_sum(vec![2, 7, 11, 15], 9); + assert_eq!(result, [0, 1]); + } + + #[test] + fn case_2() { + let result = two_sum(vec![3, 2, 4], 6); + assert_eq!(result, [1, 2]); + } + + #[test] + fn case_3() { + let result = two_sum(vec![3, 3], 6); + assert_eq!(result, [0, 1]); + } +}