From d3fb915b9569c08a1f6112516fc2c21e3fd8fe57 Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Mon, 22 Sep 2025 11:11:34 +0800 Subject: [PATCH] feat: 706_design_hashmap --- 706_design_hashmap/Cargo.lock | 7 +++++ 706_design_hashmap/Cargo.toml | 6 ++++ 706_design_hashmap/src/lib.rs | 57 +++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 706_design_hashmap/Cargo.lock create mode 100644 706_design_hashmap/Cargo.toml create mode 100644 706_design_hashmap/src/lib.rs diff --git a/706_design_hashmap/Cargo.lock b/706_design_hashmap/Cargo.lock new file mode 100644 index 0000000..8c2e22f --- /dev/null +++ b/706_design_hashmap/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "design_hashmap" +version = "0.1.0" diff --git a/706_design_hashmap/Cargo.toml b/706_design_hashmap/Cargo.toml new file mode 100644 index 0000000..4b01ffa --- /dev/null +++ b/706_design_hashmap/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "design_hashmap" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/706_design_hashmap/src/lib.rs b/706_design_hashmap/src/lib.rs new file mode 100644 index 0000000..4aa525a --- /dev/null +++ b/706_design_hashmap/src/lib.rs @@ -0,0 +1,57 @@ +use std::hash::{DefaultHasher, Hash, Hasher}; + +pub struct MyHashMap { + capacity: usize, + buckets: Vec>, +} + +impl MyHashMap { + pub fn new() -> Self { + const CAPACITY: usize = 4096; + Self { + capacity: CAPACITY, + buckets: vec![Vec::new(); CAPACITY], + } + } + + pub fn put(&mut self, key: i32, value: i32) { + let index = self.get_bucket_index(key); + let list = &mut self.buckets[index]; + + let node = list.iter_mut().find(|node| node.0 == key); + match node { + Some(node) => { + node.1 = value; + } + None => { + list.push((key, value)); + } + } + } + + pub fn get(&mut self, key: i32) -> i32 { + let index = self.get_bucket_index(key); + let list = &self.buckets[index]; + + let node = list.iter().find(|node| node.0 == key); + match node { + Some(node) => node.1, + None => -1, + } + } + + pub fn remove(&mut self, key: i32) { + let index = self.get_bucket_index(key); + let list = &mut self.buckets[index]; + + if let Some(index_to_remove) = list.iter().position(|node| node.0 == key) { + list.remove(index_to_remove); + } + } + + fn get_bucket_index(&mut self, key: i32) -> usize { + let mut hasher = DefaultHasher::new(); + key.hash(&mut hasher); + hasher.finish() as usize & (self.capacity - 1) + } +}