leecode 面试题 17.07 婴儿名字
题目链接:https://leetcode-cn.com/problems/baby-names-lcci/
分析题意可以知道这是个并查集,新增一个size数目来维护集合数量大小就可以了(size数组只有当是父节点时才有意义)
思路:将synonyms中的相同的名字合并即可,但是names的处理就比较麻烦,对于John(15)这样一个字符串,要分离出John和15这两个字符串。同时还有一个要注意点,并查集merge的时候要注意如果find的值相同(是同一个集合的),是不需要重复加的。
class Solution:def trulyMostPopular(self, names: List[str], synonyms: List[str]) -> List[str]:# initself.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] = iself.size[self.name_index_dic[name]] = int(name_size)names[i] = nameidx = 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] = idxnames.append(name1)name1_id = idxidx += 1if name2_id == None:self.name_index_dic[name2] = idxnames.append(name2)name2_id = idxidx += 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]) + ")"ans.append(s)# print(self.p)return ansp = []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 婴儿名字相关推荐
- [LeetCode][C++]面试题 17.07. 婴儿名字/并查集
面试题 17.07. 婴儿名字 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公 ...
- 面试题.17.07.婴儿名字--并查集
LeetCode 面试题 17.07.婴儿名字 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被 ...
- 并查集之面试题 17.07. 婴儿名字
并查集之面试题 17.07. 婴儿名字 前言 一, 面试题 17.07. 婴儿名字 二,解题思路 1, a和b是朋友, b和c是朋友,那a和c也是朋友.这就是典型并查集类型 2, 字典序 3, 三, ...
- 面试题 17.07. 婴儿名字 ( 字符标志 并查集 )
面试题 17.07. 婴儿名字 字符串并查集: 721. 账户合并 ( 并查集 ) 解题思路: 首先通过哈希表建立并查集,哈希表的键值对都是字符串,然后将一个相连的并查集合并: 利用一个哈希表进行计数 ...
- 面试题 17.07. 婴儿名字
面试题 17.07. 婴儿名字 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公 ...
- leetcode面试题 17.07. 婴儿名字(并查集)
每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来.给定两个列表,一个是名字 ...
- 程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)
1. 题目 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量. 有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来. 给定两个 ...
- 程序员面试金典 - 面试题 17.07. 婴儿名字
题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...
- [Leetcode 每日精选](本周主题-并查集) 面试题 17.07. 婴儿名字
题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题多了一些变化, 但核心仍然是并查集. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到该系列当前已 ...
最新文章
- Linux运行脚手架vue,【Vue】Vue-cli 搭建 脚手架
- Android Studio实用插件使用
- 不同时间段的欢迎语言
- 深度学习笔记:Tensorflow手写mnist数字识别
- 如何处理错误信息 Pricing procedure could not be determined
- 双网卡绑定linux7.2,CentOS 7.2 bond实现网卡聚合链路(双网卡绑定)脚本及验证(适合云平台)...
- Linux卸载/删除多余网卡
- 华为一所英国研发中心建设项目获当地批准 计划总投资4亿英镑
- 小鹏汽车遭多地车主维权 要求退车 孙宇晨:个人拿1000万支持维权
- 转载:互联网盈利模式
- 通过表面分析评估 Cu-CMP 工艺
- vue3 provide和 reject
- S3C2440裸机开发----点亮LED
- js获取当前域名的方法
- linux 程序被Killed,查看原因
- 2020.08.11 【ABAP随笔】-ITS Mobile 配置
- VR购物之初体验:Buy+
- 哈工大数据库系统(上):嵌入式SQL语言之动态SQL(十)课后测验与作业
- 猪八戒威客网对我的报道
- 【AI实时变声器,声音甜甜的小姐姐背后竟是抠脚大汉】
热门文章
- 使用for循环语句计算8+88+888+···前十项之和
- 高通 OpenXR SDK 使用指南(1)
- python多项式拟合_最小二乘法—多项式拟合非线性函数
- Git分布式版本控制和远程库创建运用、git常用指令【尚硅谷笔记】
- [转]智能扫描仪可准确辨识瓶中液体
- 商业研究(21):活力蛙,足疗O2O,曾经的“中国上门足疗领先品牌”
- 随机网络中的孤立点(片)处理
- 罗马复兴开源代码_社区主导的开源复兴
- ELECON 轻松掌握 洁净电力
- 云计算浅谈之三:微软云计算服务介绍