feat: 706_design_hashmap
This commit is contained in:
parent
5a8e1adf41
commit
0bf69767b8
7
706_design_hashmap/Cargo.lock
generated
Normal file
7
706_design_hashmap/Cargo.lock
generated
Normal 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"
|
6
706_design_hashmap/Cargo.toml
Normal file
6
706_design_hashmap/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "design_hashmap"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
57
706_design_hashmap/src/lib.rs
Normal file
57
706_design_hashmap/src/lib.rs
Normal 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)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user