資料結構和演算法 刷題 雜湊演算法

2021-09-27 07:03:53 字數 4106 閱讀 5063

nums1 = [1,2,2,1]

nums2 = [2,2]

#返回[2,2]

雜湊是一種查詢演算法

from  collections import counter

from collections import defaultdict #不存在的key時 返回預設值

from collections import ordereddict

nums1 = [1,2,2,1]

nums2 = [2,2]

#返回[2,2]

from collections import defaultdict

def insersect(nums1,nums2):

dic = defaultdict(int)

for i in nums1:

dic[i]+=1

result =

for j in nums2:

if dic[j]>0:

dic[j]-=1

return result

j = 'aa'#寶石

s = 'aaabbbb'

#輸出 3

def numjewinstone(j,s):

setj = set(j)

return sum(s in setj for s in s)

3.兩數之和

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

#forloop

class solution:

def twosum(self, nums: list[int], target: int) -> list[int]:

for i in range(len(nums)):

num2 = target - nums[i]

for j in range(i+1,len(nums)):

if num2 == nums[j]:

return [i,j]

#雜湊

def twosum(nums,target):

dic = {}

for i in range(len(nums)):

m = nums[i]

if target - m in dic:

return ([dic[target - m],i])

dic[m] = i

你正在和你的朋友玩 猜數字(bulls and cows)遊戲:你寫下乙個數字讓你的朋友猜。每次他猜測後,你給他乙個提示,告訴他有多少位數字和確切位置都猜對了(稱為「bulls」, 公牛),有多少位數字猜對了但是位置不對(稱為「cows」, 奶牛)。你的朋友將會根據提示繼續猜,直到猜出秘密數字。

示例 1:

輸入: secret = "1807", guess = "7810"

輸出: "1a3b"

解釋: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。

class solution:

def gethint(self, secret: str, guess: str) -> str:

secret_dict = {}

guess_dict = {}

a= 0

b = 0

for i in range(len(secret)):

if secret[i] == guess[i]:

a += 1

else :

if secret[i] in secret_dict:

secret_dict[secret[i]] += 1

else:

secret_dict[secret[i]] = 1

if guess[i] in guess_dict:

guess_dict[guess[i]] +=1

else:

guess_dict[guess[i]] =1

for digit in secret_dict:

if digit in guess_dict :

b += min(secret_dict[digit],guess_dict[digit])

return str(a)+"a" + str(b) +"b"

在英語中,我們有乙個叫做 詞根(root)的概念,它可以跟著其他一些詞組成另乙個較長的單詞——我們稱這個詞為 繼承詞(successor)。例如,詞根an,跟隨著單詞 other(其他),可以形成新的單詞 another(另乙個)。

現在,給定乙個由許多詞根組成的詞典和乙個句子。你需要將句子中的所有繼承詞用詞根替換掉。如果繼承詞有許多可以形成它的詞根,則用最短的詞根替換它。

你需要輸出替換之後的句子。

輸入: dict(詞典) = ["cat", "bat", "rat"]

sentence(句子) = "the cattle was rattled by the battery"

輸出: "the cat was rat by the bat" 

#暴力破解法

class solution:

def replacewords(self, dict: list[str], sentence: str) -> str:

s = sentence.split(' ')

for item in dict :

for i in range(len(s)):#i=1 s[1] = the

n = len(item)#cat 3

if item ==s[i][:n]:

s[i] = item

return ' '.join(s)

from collections import defaultdict

def replacewords(dict,sentence):

d = defaultdict(set)

s = defaultdict(int)

sentense = sentence.split()

for w in dict:

print(w[0])

d[w[0]].add(w)

s[w[0]] = max(s[w[0]],len(w))

for i ,w in enumerate(sentence):

for j in range(s[w[0]]):

if w[:j+1] in d[w[0]]:

sentense[i] = w[:j+1]

break

return ' '.join(sentence)

6 leetcode3. 無重複字元的最長子串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

from collections import defaultdict

class solution:

def lengthoflongestsubstring(self, s: str) -> int:

lookup = defaultdict(int)

start = 0

end = 0

max_len = 0

counter = 0

while end < len(s):

if lookup[s[end]] > 0:

counter += 1

lookup[s[end]] += 1

end += 1

while counter > 0:

if lookup[s[start]] > 1:

counter -= 1

lookup[s[start]] -= 1

start += 1

max_len = max(max_len, end - start)

return max_len

資料結構和演算法 雜湊演算法

前面我們學習了雜湊表,雜湊函式,和雜湊演算法啥關係?其實不管雜湊還是雜湊,都是翻譯的差別,對於英文都是hash,所以雜湊 雜湊 hash 雜湊演算法的定義 將任意長度的二進位制串對映為固定長度的二進位制串,這種對映規則就是雜湊演算法。通過原始資料對映成的規定固定長度的二級制串就是雜湊值乙個優秀的雜湊...

資料結構和演算法 雜湊演算法

一 定義 1 將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法。通過原始資料對映之後得到的二進位制值串就是雜湊值。二 hash演算法編寫要求 從雜湊值不能反向推導出原始資料 對輸入資料非常敏感,哪怕原始資料只修改了乙個bit,最後得到的hash值也會變化 雜湊衝突的...

資料結構 雜湊演算法

最近開始學習王爭老師的 資料結構與演算法之美 通過總結再加上自己的思考的形式記錄這門課程,文章主要作為學習歷程的記錄。雜湊演算法的定義是將任意長度的二進位制值串對映為固定長度的二進位制值串。這個對映規則就是雜湊演算法。通過原始資料對映後得到的二進位制值串就是雜湊值。設計乙個優秀的雜湊演算法應滿足幾點...