feat: 706_design_hashmap

This commit is contained in:
SquidSpirit 2025-09-22 11:11:34 +08:00
parent 5a8e1adf41
commit 0bf69767b8
3 changed files with 70 additions and 0 deletions

7
706_design_hashmap/Cargo.lock generated Normal file
View File

@ -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"

View File

@ -0,0 +1,6 @@
[package]
name = "design_hashmap"
version = "0.1.0"
edition = "2024"
[dependencies]

View File

@ -0,0 +1,57 @@
use std::hash::{DefaultHasher, Hash, Hasher};
pub struct MyHashMap {
capacity: usize,
buckets: Vec<Vec<(i32, i32)>>,
}
impl MyHashMap {
pub fn new() -> Self {
let capacity = 8192;
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)
}
}