題目
不使用任何內建的哈希表庫設計一個哈希映射(HashMap)。
實現?MyHashMap
?類:
MyHashMap()
?用空映射初始化對象void put(int key, int value)
?向 HashMap 插入一個鍵值對?(key, value)
?。如果?key
?已經存在于映射中,則更新其對應的值?value
?。int get(int key)
?返回特定的?key
?所映射的?value
?;如果映射中不包含?key
?的映射,返回?-1
?。void remove(key)
?如果映射中存在?key
?的映射,則移除?key
?和它所對應的?value
?。
示例:
輸入: ["MyHashMap", "put", "put", "get", "get", "put", "get", "remove", "get"] [[], [1, 1], [2, 2], [1], [3], [2, 1], [2], [2], [2]] 輸出: [null, null, null, 1, -1, null, 1, null, -1]解釋: MyHashMap myHashMap = new MyHashMap(); myHashMap.put(1, 1); // myHashMap 現在為 [[1,1]] myHashMap.put(2, 2); // myHashMap 現在為 [[1,1], [2,2]] myHashMap.get(1); // 返回 1 ,myHashMap 現在為 [[1,1], [2,2]] myHashMap.get(3); // 返回 -1(未找到),myHashMap 現在為 [[1,1], [2,2]] myHashMap.put(2, 1); // myHashMap 現在為 [[1,1], [2,1]](更新已有的值) myHashMap.get(2); // 返回 1 ,myHashMap 現在為 [[1,1], [2,1]] myHashMap.remove(2); // 刪除鍵為 2 的數據,myHashMap 現在為 [[1,1]] myHashMap.get(2); // 返回 -1(未找到),myHashMap 現在為 [[1,1]]
提示:
0 <= key, value <= 106
- 最多調用?
104
?次?put
、get
?和?remove
?方法
class MyHashMap {//創建哈希集合大小,其表現方式為數組BASE: number;//二維數組,其第二維表現方式為鏈表 [[[1,1],[2,2]]]data: [number, number][][];constructor() {//初始化集合大小為 1111,注意:該值最好是質數this.BASE = 1111;// 初始化集合,長度為 BASE,其中每一個值都是一個鏈表,存儲著值this.data = new Array(this.BASE).fill(0).map(() => []);}// 哈希函數,將哈希的key控制在一定范圍,如add一萬個數據,則可能要有一萬個key// 哈希函數通過 取模,將key控制在固定范圍,相同key的,但不同值,則用鏈表的方式存儲// 如 key = 1 , BASE = 1111 則hashKey = 1// key = 1112 , BASE = 1111 則hashKey = 1getHashKey(key: number) {return key % this.BASE;}put(key: number, value: number): void {// 獲取該值的 hashKeyconst hashKey = this.getHashKey(key);for (const ele of this.data[hashKey]) {// 找到則更新valueif (ele[0] === key) {ele[1] = value;return;}}// 沒找到,則新增this.data[hashKey].push([key, value]);}get(key: number): number {// 獲取該值的 hashKeyconst hashKey = this.getHashKey(key);for (const ele of this.data[hashKey]) {// 找到則返回valueif (ele[0] === key) {return ele[1];}}// 沒找到,返回-1return -1;}remove(key: number): void {// 獲取該值的 hashKeyconst hashKey = this.getHashKey(key);const d = this.data[hashKey];for (let i = 0; i < d.length; i++) {// 找到,則刪除if (d[i][0] === key) {d.splice(i, 1);}}}
}