python leetcode_七十五、Python | Leetcode哈希表系列
@Author:Runsen
@Date:2020/7/3
人生最重要的不是所站的位置,而是內(nèi)心所朝的方向。只要我在每篇博文中寫得自己體會,修煉身心;在每天的不斷重復(fù)學(xué)習(xí)中,耐住寂寞,練就真功,不畏艱難,奮勇前行,不忘初心,砥礪前行,人生定會有所收獲,不留遺憾 (作者:Runsen )
作者介紹:Runsen目前大三下學(xué)期,專業(yè)化學(xué)工程與工藝,大學(xué)沉迷日語,Python, Java和一系列數(shù)據(jù)分析軟件。導(dǎo)致翹課嚴(yán)重,專業(yè)排名中下。.在大學(xué)60%的時間,都在CSDN。決定今天比昨天要更加努力。 前面文章,點擊下面鏈接
我的Python教程,不斷整理,反復(fù)學(xué)習(xí)
今日,我決定繼續(xù)更新Python教程,今天就開始了七十五、Python | Leetcode哈希表系列。
哈希表
哈希表(散列表)的思想是將關(guān)鍵字 Key 映射到存放記錄的散列表中從而進(jìn)行快速訪問,其中映射函數(shù) f(key) 稱為哈希函數(shù)(散列函數(shù)),依據(jù)哈希函數(shù)建立的查找表稱為哈希表。
Hash,音譯為哈希,是把任意長度的輸入(又叫做預(yù)映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。
假如班級里面有50個學(xué)生,都有各自的名字,我們想把學(xué)生的名字放在一個表上,同時便于很快的查找,你會毫無想到數(shù)組,但是查找的復(fù)雜度是O(n),所以哈希表就是為了解決這問題,將查找的復(fù)雜度達(dá)到 O(1)
假如有個學(xué)生的名字叫做lies,通過hash函數(shù),得到下標(biāo)9 ,將lies的ASCII碼加起來 429%30 =9 ,這樣的過程就是hash函數(shù)。
但是又沒有可能出現(xiàn)hash碰撞,就是出現(xiàn)了一樣的hash值,當(dāng)然有可能
假如有個人的名字叫做foes,那么如何查找呢?當(dāng)然是將數(shù)據(jù)儲存成鏈表,用鏈表的方式來查找。
其實,哈希表就是一個具備映射關(guān)系的表,我們可以通過映射關(guān)系由鍵找到值。下面是一個簡單的哈希表:
class?Map:????def?__init__(self):????????self.items?=[None]*100????def?hash(self,a):????????return?a*1+0????def?put(self,k,v):????????self.items[hash(k)]?=?v????def?get(self,k):????????hashcode=hash(k)????????return?self.items[hashcode]這個哈希函數(shù)十分簡單,但簡單不妨礙它成為一個哈希函數(shù),事實上,它叫直接定址法,是一個線性函數(shù):
直接定址法的優(yōu)點很明顯,就是它不會產(chǎn)生重復(fù)的hash值。但由于它與鍵值本身有關(guān)系,所以當(dāng)鍵值分布很散的時候,會浪費大量的存儲空間。所以一般是不會用到直接定址法的。
LeetCode 第 136題:只出現(xiàn)一次的數(shù)字
#給定一個非空整數(shù)數(shù)組,除了某個元素只出現(xiàn)一次以外,其余每個元素均出現(xiàn)兩次。找出那個只出現(xiàn)了一次的元素。?#?說明:?#?你的算法應(yīng)該具有線性時間復(fù)雜度。?你可以不使用額外空間來實現(xiàn)嗎??#?示例?1:?#?輸入:?[2,2,1]#輸出:?1#?示例?2:?#?輸入:?[4,1,2,1,2]#輸出:?4?#?Related?Topics?位運(yùn)算?哈希表下面一行代碼不做解釋。
class?Solution:????def?singleNumber(self,?nums:?List[int])?->?int:????????return?sum(set(nums))*2-sum(nums)一遍遍歷,用哈希表計數(shù);再遍歷,返回個數(shù)是1的數(shù)。{}用于創(chuàng)建空字典,空集合用set() dict的.get(a,b)中取出字典中鍵為a的值,如果不存在這樣的鍵,則返回b。
class?Solution:????def?singleNumber(self,?nums:?List[int])?->?int:????????dic?=?{}????????for?i?in?nums:????????????dic[i]?=?dic.get(i,0)+1????????????????????for?i?in?nums:????????????if?dic.get(i)==1:????????????????return?iLeetCode 第 217題:存在重復(fù)元素
#給定一個整數(shù)數(shù)組,判斷是否存在重復(fù)元素。?#?如果任意一值在數(shù)組中出現(xiàn)至少兩次,函數(shù)返回?true?。如果數(shù)組中每個元素都不相同,則返回?false?。?#?示例?1:?#?輸入:?[1,2,3,1]#輸出:?true?#?示例?2:?#?輸入:?[1,2,3,4]#輸出:?false?#?示例?3:?#?輸入:?[1,1,1,3,3,4,3,2,4,2]#輸出:?true?#?Related?Topics?數(shù)組?哈希表下面代碼不解釋
class?Solution:????def?containsDuplicate(self,?nums:?List[int])?->?bool:????????if?len(set(nums))?==?len(nums):????????????return?False????????else:?????????????return?True初試化哈希表dic = {}。遍歷數(shù)組:若i不在hash中,則令dic[i] = 1為key,1為value(隨便什么都可以)。若已存在,則返回True。
class?Solution:????def?containsDuplicate(self,?nums:?List[int])?->?bool:????????dic?=?{}????????for?i?in?nums:????????????if?dic.get(i):????????????????return?True????????????dic[i]?=?1????????return?False劍指 Offer 50. 第一個只出現(xiàn)一次的字符
#在字符串?s?中找出第一個只出現(xiàn)一次的字符。如果沒有,返回一個單空格。?s?只包含小寫字母。?#?示例:?#?s?=?"abaccdeff"#返回?"b"#s?=?""?#返回?"?"#?限制:?#?0?<=?s?的長度?<=?50000?#?Related?Topics?哈希表遍歷字符串 s ,使用哈希表統(tǒng)計 “各字符數(shù)量是否 > 1 ”。 再遍歷字符串 s ,在哈希表中找到首個 “數(shù)量為 1的字符”,并返回。
class?Solution:????def?firstUniqChar(self,?s:?str)?->?str:????????dicts={}????????for?i?in?s:????????????dicts[i]=dicts.get(i,0)+1????????for?i?in?s:????????????if?dicts[i]==1:????????????????return?i????????return?'?'總結(jié)
以上是生活随笔為你收集整理的python leetcode_七十五、Python | Leetcode哈希表系列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想天津工厂落成 未来年产300万电脑及
- 下一篇: python英文语义角色标注_八款中文词