日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)

發(fā)布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试金典 - 面试题 17.07. 婴儿名字(并查集) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 題目

每年,政府都會公布一萬個最常見的嬰兒名字和它們出現(xiàn)的頻率,也就是同名嬰兒的數(shù)量。
有些名字有多種拼法,例如,John 和 Jon 本質上是相同的名字,但被當成了兩個名字公布出來。

給定兩個列表,一個是名字及對應的頻率,另一個是本質相同的名字對。
設計一個算法打印出每個真實名字的實際頻率。
注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,則 John 與 Johnny 也相同,即它們有傳遞和對稱性。

在結果列表中,選擇字典序最小的名字作為真實名字。

示例: 輸入:names = ["John(15)","Jon(12)","Chris(13)","Kris(4)","Christopher(19)"], synonyms = ["(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"] 輸出:["John(27)","Chris(36)"]提示: names.length <= 100000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/baby-names-lcci
著作權歸領扣網(wǎng)絡所有。商業(yè)轉載請聯(lián)系官方授權,非商業(yè)轉載請注明出處。

2. 解題

  • 參考:并查集(Disjoint-Set)

相關題目:
LeetCode 959. 由斜杠劃分區(qū)域(并查集)
LeetCode 1202. 交換字符串中的元素(并查集)

class Solution {unordered_map<string,string> father;//并查集unordered_map<string,int> m;//名稱,頻次 public:vector<string> trulyMostPopular(vector<string>& names, vector<string>& synonyms) {string name, name1, name2, p;int i, count;for(string& n : names){i = n.find("(");name = n.substr(0,i);count = 0;while(++i < n.size()-1)count = 10*count+n[i]-'0';m[name] = count;//獲取每個名字的次數(shù)father[name] = name;//并查集初始化}for(auto& n : synonyms){ //這里可能有上面不存在的name,再添加一遍i = n.find(",");name1 = n.substr(1,i-1);name2 = n.substr(i+1,n.size()-i-2);father[name1] = name1;//并查集初始化father[name2] = name2;//并查集初始化}for(auto& n : synonyms){i = n.find(",");name1 = n.substr(1,i-1);name2 = n.substr(i+1,n.size()-i-2);merge(name1,name2);//全部進行合并和路徑壓縮}unordered_map<string,vector<string>> fatherSet;for(auto f : father)//壓縮后的f(只有兩層),所有邊的頂層(字典序最小的){name = f.first;p = uniFind(name);fatherSet[p].push_back(name);}vector<string> ans;for(auto& f : fatherSet){ //所有的等效名字count = 0;for(auto& v : f.second)//它底下包含的namecount += m[v];//加上他的計數(shù)ans.push_back(f.first+"("+to_string(count)+")");}return ans;}string uniFind(string x){if(x == father[x])return x;return father[x] = uniFind(father[x]);//等式為路徑壓縮操作}void merge(string x, string y){string fatherx = uniFind(x);string fathery = uniFind(y);if(fatherx != fathery){if(fatherx < fathery)swap(fatherx, fathery);//x的字典序大father[fatherx] = fathery;//字典序小的y做代表}} };

寫的比較差,效率比較低

總結

以上是生活随笔為你收集整理的程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。