題目連結(jié):
題目意譯:
設(shè)計一個雜湊集合 HashSet,但是不得使用任何內(nèi)建的雜湊表函式庫等。
特定地,你需要包含以下函式:
add(value): 插入一個值到 HashSet 裡。
contains(value): 回傳 value 是否存在於 HashSet。
remove(value): 從 HashSet 移除 value 這個值。如果 value 並不存在於 HashSet 中,則不需做任何動作。
注:
所有的值皆位於 [0, 1000000] 範(fàn)圍之中。
操作數(shù)量一定位於 [1, 10000] 範(fàn)圍之中。
請不要使用任何內(nèi)建雜湊函式庫。
範(fàn)例測資:
MyHashSet hashSet = new MyHashSet();
hashSet.add(1);
hashSet.add(2);
hashSet.contains(1); // 回傳真(true)
hashSet.contains(3); // 回傳假(false)(找不到)
hashSet.add(2);
hashSet.contains(2); // 回傳真
hashSet.remove(2);
hashSet.contains(2); // 回傳假(已經(jīng)移除)
解題思維:
如果不考慮空間消耗的話,就直接開一個大小為 1000001 的布林陣列,什麼值進(jìn)來就將對應(yīng)索引值的位置設(shè)為真(True)代表有這個數(shù)字、要刪除什麼值就直接將對應(yīng)位置設(shè)為假(False)、要找值就直接看對應(yīng)的布林陣列之位置之值。
但是如果想要省空間的話,可以使用類似
這題的方式——將進(jìn)來的數(shù)字取除以某個數(shù)字 M 的餘數(shù),而上述的陣列變?yōu)閮Υ孢B結(jié)串列(Linked List)的開頭或是一棵平衡二元樹,端看讀者想實(shí)作何者。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。