leecode 面試題 17 07 嬰兒名字

2021-10-21 17:46:46 字數 2239 閱讀 5266

分析題意可以知道這是個並查集,新增乙個size數目來維護集合數量大小就可以了(size陣列只有當是父節點時才有意義)

思路:將synonyms中的相同的名字合併即可,但是names的處理就比較麻煩,對於john(15)這樣乙個字串,要分離出john和15這兩個字串。同時還有乙個要注意點,並查集merge的時候要注意如果find的值相同(是同乙個集合的),是不需要重複加的。

class solution:

def trulymostpopular(self, names: list[str], synonyms: list[str]) -> list[str]:

# init

self.p = list(range(0, len(names)+100, 1))

self.size = [0] * (len(names)+100);

self.name_index_dic = {}

for i in range(len(names)):

name = names[i]

index= name.find('(')

name_size = name[index+1:-1]

name = name[:index]

self.name_index_dic[name] = i

self.size[self.name_index_dic[name]] = int(name_size)

names[i] = name

idx = len(names)

# 合併

for synonym in synonyms:

index = synonym.find(',')

name1 = synonym[1:index]

name2 = synonym[index+1:-1]

name1_id = self.name_index_dic.get(synonym[1:index])

name2_id = self.name_index_dic.get(synonym[index+1:-1])

if name1_id == none:

self.name_index_dic[name1] = idx

name1_id = idx

idx += 1

if name2_id == none:

self.name_index_dic[name2] = idx

name2_id = idx

idx += 1

# print(str(name1_id)+" "+str(name2_id))

self.__merge(name1_id, name2_id)

# 路徑壓縮

for i in range(len(names)):

self.__find(i)

# 得到字典序最小的名字

index_name_dict = {}

for i in range(len(names)):

if index_name_dict.__contains__(self.p[i]):

now = index_name_dict.get(self.p[i])

if names[i] < now:

index_name_dict[self.p[i]] = names[i]

else:

index_name_dict[self.p[i]] = names[i];

# 組裝答案

ans =

for key in index_name_dict:

s = index_name_dict[key] + "(" + str(self.size[key]) + ")"

# print(self.p)

return ans

p =

size =

name_index_dic = {}

def __find(self, x : int):

if x != self.p[x]:

self.p[x] = self.__find(self.p[x])

return self.p[x]

def __merge(self, a : int, b : int):

a = self.__find(a)

b = self.__find(b)

if a != b:

self.p[a] = b;

self.size[b] += self.size[a]

leecode 面試題 17 07 嬰兒名字

分析題意可以知道這是個並查集,新增乙個size數目來維護集合數量大小就可以了 size陣列只有當是父節點時才有意義 思路 將synonyms中的相同的名字合併即可,但是names的處理就比較麻煩,對於john 15 這樣乙個字串,要分離出john和15這兩個字串。同時還有乙個要注意點,並查集merg...

LeeCode精選top面試題

思路 巧用進製變數 if 1 include include using namespace std listgetrevalue listll,listlr if iterlr lr.end int sum iterll iterlr carry 10 lres.emplace back sum ...

面試題 PHP面試題

建議 比如是系統配置,缺少了無法執行,自然使用 require 如果某一段程式少了,只是少了統計 訪問的,不是必不可少的。可以使用 include 而加不加 once 就是效率上的區別,雖然系統會幫你考慮只包含一次,但系統的判斷會降低效率,因此,更應該在開發之初,把目錄結構調整高好,盡量不使用 on...