面试题.17.07.婴儿名字--并查集

2023-10-26

LeetCode

面试题 17.07.婴儿名字

每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,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)"]

解法:并查集

解题思路:

用并查集的思想就是,如果两个名字分属两个不同的集合,那么就将这两个集合合并,然后计算出新的出现次数

代码如下:

class Solution {
    public String[] trulyMostPopular(String[] names, String[] synonyms) {
        Map<String, Integer> map = new HashMap<>();
        Map<String, String> unionMap = new HashMap<>();     //并查集, key(子孙)->value(祖宗)
        for (String name : names) 
        {     //统计频率
            int idx1 = name.indexOf('(');
            int idx2 = name.indexOf(')');
            int frequency = Integer.valueOf(name.substring(idx1 + 1, idx2));
            map.put(name.substring(0, idx1), frequency);
        }
        for (String pair : synonyms) 
        {  //union同义词
            int idx = pair.indexOf(',');
            String name1 = pair.substring(1, idx);
            String name2 = pair.substring(idx + 1, pair.length() - 1);
            while (unionMap.containsKey(name1)) 
            {   //找name1祖宗
                name1 = unionMap.get(name1);
            }
            while (unionMap.containsKey(name2)) 
            {   //找name2祖宗
                name2 = unionMap.get(name2);
            }
            if(!name1.equals(name2))
            {   //祖宗不同,要合并
                int frequency = map.getOrDefault(name1, 0) + map.getOrDefault(name2, 0);    //出现次数是两者之和
                String trulyName = name1.compareTo(name2) < 0 ? name1 : name2;
                String nickName = name1.compareTo(name2) < 0 ? name2 : name1;
                unionMap.put(nickName, trulyName);      //小名作为大名的分支,即大名是小名的祖宗
                map.remove(nickName);       //更新一下数据
                map.put(trulyName, frequency);
            }
        }
        String[] res = new String[map.size()];
        int index = 0;
        for (String name : map.keySet()) 
        {
            StringBuilder sb = new StringBuilder(name);
            sb.append('(');
            sb.append(map.get(name));
            sb.append(')');
            res[index++] = sb.toString();
        }
        return res;
    }
}

解法来源

作者:accountofjizhiwei
链接:https://leetcode-cn.com/problems/baby-names-lcci/solution/bing-cha-ji-si-lu-yong-hashmapzuo-95ms-by-accounto/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

感想

在做这道题时,其实我的思路还是挺清晰的,但是太执着于用parent数组来实现并查集,没想到还可以用哈希表来当做并查集的树,学到了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试题.17.07.婴儿名字--并查集 的相关文章

  • 编程艺术 - 第二章 、俩个字符串是否包含问题以及扩展

    1 题目 假设这有一个各种字母组成的字符串 假设这还有另外一个字符串 而且这个字符串里的字 母数相对少一些 从算法是讲 什么方法能最快的查出所有小字符串里的字母在大字符串里 都有 比如 如果是下面两个字符串 String 1 ABCDEFG
  • 面试题.17.07.婴儿名字--并查集

    LeetCode 面试题 17 07 婴儿名字 每年 政府都会公布一万个最常见的婴儿名字和它们出现的频率 也就是同名婴儿的数量 有些名字有多种拼法 例如 John 和 Jon 本质上是相同的名字 但被当成了两个名字公布出来 给定两个列表 一
  • 蓝桥杯——七段码(并查集+二进制情况罗列)

    问题网站 https www lanqiao cn problems 595 learning contest id 73 这道题就是相邻的段可以表示一种符号 最少必须要有一段 其实我最初的想法就是把全部的符号表示按照符号个数分别罗列出来
  • python: 字典 (dict) 的使用

    摘要 在刷 leecode 的题目时 会经常使用哈希表 在 python 中称为字典 dict 由于本人平时不怎么多使用字典 在真正运用时经常忘记其常规用法 特别是其成员函数的使用 因此 本人根据自己在刷 leecode 时经常使用字典的方
  • 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

    哈希表 线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时 ASL 1 n frac 1 n n1
  • 数据结构--并查集

    并查集适用情况 1 有时候 并不关心数据之间的前后关系 也不关心数据的层次关系 一些确定元素只是单纯的聚集在一起 这样的元素聚集集合被称为集合 当希望知道某个数据是否存在一个集合中 或者两个元素是否在同一个集合中时 就需要使用一些集合数据结
  • LeetCode 49. 字母异位词分组

    题目链接 https leetcode cn problems group anagrams 思路如下 输入 strs eat tea tan ate nat bat 对每个字符串进行排序 strs aet aet ant aet ant
  • 数据结构实验9:并查集的使用

    问题描述 给定一个图 图中有N个顶点 1 lt N lt 500 编号依次为1 2 3 N 部分顶点之间存在一条无向边 请找出图中所有的极大连通子图 其中 极大联通子图可以描述为该子图中任意两个顶点之间都存在一条路径 且加入任何一个不在该子
  • HDU--1233:还是畅通工程 (并查集 & 最小生成树Prim)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1233 2 简单思路 先对村庄距离从小到大排序 然后使用并查集的查找 一边查找一边加上村庄之间的距离 从而得到可以走通所有村庄的最短距离 3
  • 种类并查集+入门题A Bug's Life

    我觉得种类并查集还是先从一个基础入门题讲起吧 Background Professor Hopper is researching the sexual behavior of a rare species of bugs He assum
  • 力扣:350.两个数组的交集 II

    力扣 350 两个数组的交集 II 题目 给你两个整数数组 nums1 和 nums2 请你以数组形式返回两数组的交集 返回结果中每个元素出现的次数 应与元素在两个数组中都出现的次数一致 如果出现次数不一致 则考虑取较小值 可以不考虑输出结
  • 哈希表结构

    1 哈希值 1 概念 是一个十进制的整数 由系统随机给出 就是对象的地址值 但这是一个逻辑地址 是模拟出来的 不是数据实际存储的物理地址 2 获取哈希值 可通过Object类的 hasCode 方法获取哈希值 hasCode 源码如下 pu
  • G. Counting Graphs(并查集)

    Problem G Codeforces 给定一个由n个顶点组成的树 树是一个无圈的连通无向图 树的每条边都有它的权重wi 你的任务是计算满足以下四个条件的不同图形的数量 Plain Text 图形没有自环和多重边 图形的边上的权重是整数且
  • #LeetCode刷题——350. 两个数组的交集 II

    难度 easy 1 题目介绍 2 思路分析 第一种方法 双指针法 先对俩个数组进行排序 使用俩个指针 i 和 j 不停遍历nums1和nums2 比较俩个元素的值 如果相等就增加到结果集中 如果 nums1 i lt nums2 j 将 i
  • LeetCode 1.两数之和

    题目链接 1 两数之和 思路分析 可以暴力枚举时间复杂度为 O n 2 O n 2 O n2 也可以用哈希表
  • Supermarket 【POJ - 1456】【并查集+哈希表思想+贪心】

    题目链接 原来 并查集还有这样的作用 题记 我想用个哈希表的思维来解这道题 但是 显然O N 2 的哈希表去查询并插入显然是不行的 那么既然挂在图论专题 我就得用相应的方式解答咯 要是不挂在图论专题 我可能会自闭了 我们对于每个物品按照价值
  • Financial Crisis【点双连通分量】

    题目链接 HDU 3749 你以为学了Tarjan会写几个边双就真的理解什么是双连通分量了吗 我原来真的不懂什么叫做点双BCC 不过这都没有关系 解决了这个问题之后 我终于知道了什么叫做点双连通分量了 这是一个绝对绝对经典的问题 首先讲一下
  • 哈希函数的特征_哈希函数及其特征

    哈希函数的特征 Prerequisite Hashing data structure 先决条件 哈希数据结构 The hash function is the component of hashing that maps the keys
  • 两数之和 暴力美学 哈希表

    1 两数之和 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 的那 两个 整数 并返回它们的数组下标 leetcode 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出
  • Leetcode 题解系列--Leetcode1 两数之和

    题目描述 两数之和 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能使用两遍 解题思路 解法一 直观的

随机推荐

  • HTTP传输协议原理

    目录 1 简介 1 1 简单的HTTP协议 1 2 主要特点 1 3 HTTP请求响应模型 2 工作原理与过程 2 1 工作原理 2 2 用户访问网站的过程 2 3 HTTP协议栈中各层数据流 3 请求 1 请求方法 2 请求的网址 3 请
  • scala ide + helloworld

    http blog csdn net asongoficeandfire article details 21490101 简介 在上一篇文章中 我们阐述了Coursera使用Scala的理由 以及Scala的优缺点 说多不如少练 我们今天
  • 一文讲透缓存方案及常见问题——初篇

    Hello 大家好 今天跟大家聊的一个话题就是 缓存 目前 面向C端的服务架构中 除开管理后台等访问量很少 实时性要求较高的服务可不使用缓存外 缓存已成为高性能分布式系统里不可或缺的一环 本文不打算过多涉及具体的缓存组件如Memcached
  • Python读取文件并修改文件内容后保存为新文件

    下面是例子是读取一个文件内容 并且改变其中满足正则的行 进行内容追加 use command reWriteFile py oldFileName txt newFileName txt import re import sys param
  • 计算机内存比外存容量大吗,内存容量一般比外存容量大吗

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 内存容量一般比外存容量大 计算机的内存容量通常是指随机存储器 RAM 的容量 是内存条的关键性参数 内存容量以MB作为单位 可以简写为M 内存的容量一般都是2的整次方倍 比
  • qt qmake 生成的makefile介绍

    参考 概述 跟我一起写Makefile 1 0 文档 NMAKE参考之五 Makefile中的命令 nmake在指定目录下生成 XanaduT的博客 CSDN博客 NMAKE Reference Microsoft Learn 目录 序 m
  • ARM基础--指令集汇编常用指令

    目录 简单的ARM程序 ARM指令集的分类 ARM数据处理指令 ARM跳转指令 ARM的Load Srore指令 ARM的状态寄存器传送指令 ARM软中断指令 ARM伪指令 ARM混合编程 简单的ARM程序 text 表示当前为代码段 gl
  • 拯救者笔记本ubuntu亮度调节

    终端 nvidia settings 点击 DP 2 点击右侧 Color Correction 调节 Brightness即可
  • centos7 arm内核配置yum源

    yum配置文件替换 一 cd到目录 etc yum repos d 创建 替换下面三个文件 1 CentOS Base repo CentOS Base repo The mirror system uses the connecting
  • Java中常用API和标准类的使用与优化

    目录 一 API和Java API简介 二 Object类的重要性 三 Objects工具类的使用 四 标准类的设计与使用 五 String类的特点和常用方法 六 API查找文档及其方法和技巧 一 API和Java API简介 API是Ap
  • 鸿蒙系统应用开发初体验(一)

    上学时期就对操作系统非常有兴趣 甚至还想自己动手尝试尝试 曾买来一堆关于操作系统的书籍肯 这不 翻出来几年前的博客 动手写简单的嵌入式操作系统https blog csdn net yyz 1987 article details 9901
  • VirtualBox虚拟机安装CentOS7.6后无法ssh远程连接虚拟机

    问题如题所述 安装完 一般都是使用ip addr查看虚拟机IP后通过远程工具来尝试连接 虚拟机IP 然后会发现通过此IP无法连接 解决办法 修改VirtualBox的网络配置 1 查看VirtualBox对应网卡的IP地址 对应的IP为19
  • 【数组】点菜题目描述小木呆去食堂吃中饭,食堂提供的菜比较丰富有n(0<n<=1000)种,各种菜都有一个价格ci(ci>0并且都是整数),但他口袋里只剩下m元钱,他计划买两个不同的菜,请问他有多少

    数组 点菜 题目描述 小木呆去食堂吃中饭 食堂提供的菜比较丰富有n 0
  • MySql修改表名的两种方法

    一 rename rename table 旧表名 to 新表名 rename table mysu to new su 二 alter alter table 旧表名 rename as 新表名 alter table mysu rena
  • Python Crypto.Cipher加密包

    The Crypto Cipher package contains algorithms for protecting the confidentiality of data Crypto Cipher包含保护机密数据的加密算法 Inst
  • copy()及copy.deepcopy()

    在说浅拷贝和深拷贝之前先咱们先看看这张图片 A 1 2 3 4 5 6 B A B 0 S print B print A 可以看到只是修改了B中的值但A中的值也随之改变 可以直接推断出A B的存储位置都在同一个地方 现在上浅拷贝 浅拷贝和
  • pnpm install 安装依赖失败

    在使用 pnpm install pnpm i 遇到了一个报错 在使用 EPERM operation not permitted unlink E pnpm store v3 files 9e 经过咨询和查询 得到解决方案是 键盘 win
  • python-pptx处理替换文本

    python中使用python ppt库操作ppt来替换文本内容 包括图片在前方的 from pptx import Presentation from pptx enum shapes import MSO SHAPE TYPE def
  • Whitted光线追踪

    更详细的内容可以看知乎的这篇文章 这里简要的说了一下几何光学的规则 这里引出了光线追踪 正向 从光源开始 和反向 从眼睛开始 在介绍光线追踪前 先来看一些比较简单的 W h i t t e d
  • 面试题.17.07.婴儿名字--并查集

    LeetCode 面试题 17 07 婴儿名字 每年 政府都会公布一万个最常见的婴儿名字和它们出现的频率 也就是同名婴儿的数量 有些名字有多种拼法 例如 John 和 Jon 本质上是相同的名字 但被当成了两个名字公布出来 给定两个列表 一