数据结构 之map/set练习

文章目录

  • 1. 只出现一次的数字
    • 算法原理:
    • 代码:
  • 2. 随机链表的复制
    • 算法原理:
    • 代码:
  • 3. 宝石与石头
    • 算法原理:
    • 代码:
  • 4. 坏键盘打字
    • 算法原理:
    • 代码:
  • 5. 前K个高频单词
    • 算法原理:
    • 代码:

1. 只出现一次的数字

在这里插入图片描述
原题链接


算法原理:

这里这需要使用一个哈希表
把所有的元素放入到哈希表中,因为哈希表中不能放入重复的元素

代码:

class Solution {public int singleNumber(int[] nums) {HashSet<Integer> set = new HashSet<>();for(int x : nums) {if(!set.contains(x)) {set.add(x);}else {set.remove(x);}}for(int x : nums) {if(set.contains(x)) {return x;}}return -1;}
}

在这里插入图片描述

2. 随机链表的复制

在这里插入图片描述
在这里插入图片描述
原题链接


算法原理:

我们刚看到题一定很懵,但是我们可以画图来看一下,什么叫做复制链表

在这里插入图片描述
两个链表的结构完全一样,但是值不一样
所以我们现在就是看,如何让第二个链表和第一个链表展现出来一样的东西

这个时候我们需要一个哈希表,来把新节点和老节点放入进去
这样我们在new 新的节点的时候,就可以通过一一对应的关系,把老节点对应的关系展现出来
在这里插入图片描述
在这里插入图片描述这个时候
map.get(cur).next = map.get(cur.next)
map.get(cur).random = map.get(cur.random)

代码:

public Node copyRandomList(Node head) {HashMap<Node,Node> map = new HashMap<>();Node cur = head;while (cur != null) {Node node = new Node(cur.val);map.put(cur,node);cur = cur.next;}cur = head;while (cur != null) {map.get(cur).next = map.get(cur.next);map.get(cur).random = map.get(cur.random);cur = cur.next;}return map.get(head);}

在这里插入图片描述

3. 宝石与石头

在这里插入图片描述
原题链接


算法原理:

先把宝石放到哈希表中
再遍历石头,如果哈希表中有这个字母
计数器++
最后返回计数器的值

代码:

public int numJewelsInStones(String jewels, String stones) {int count = 0;HashSet<Character> set = new HashSet<>();for (char ch : jewels.toCharArray()) {set.add(ch);}for (char ch : stones.toCharArray()) {if (set.contains(ch)) {count++;}}return count;}

在这里插入图片描述

4. 坏键盘打字

在这里插入图片描述
在这里插入图片描述
原题链接


算法原理:

要求的输出,只输出大写,并且只输出一次
这个时候,我们先把输入的那一行字母放入到哈希表中
然后再new 一个哈希表
经过对比之后,再把坏键盘的字母放入到哈希表中
这样第二个哈希表中的就是要求的值

代码:

	public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextLine()) {String str1= in.nextLine();String str2= in.nextLine();func(str1,str2);}}private static void func(String str1,String str2) {HashSet<Character> set = new HashSet<>();for (char ch : str2.toUpperCase().toCharArray()) {set.add(ch);//把可以输出的键都放入了哈希表}HashSet<Character> set2 = new HashSet<>();for (char ch : str1.toUpperCase().toCharArray()) {if (!set.contains(ch) && !set2.contains(ch)) {System.out.print(ch);set2.add(ch);}}}

在这里插入图片描述

5. 前K个高频单词

在这里插入图片描述
原题链接


算法原理:

  1. 先统计单词出现的次数
  2. 建立小根堆,指定比较的方式
  3. 遍历map 调整优先级队列

注意在建立小根堆的时候需要考虑到前三个单词次数一样的情况下,需要用大根堆来排序

代码:

public List<String> topKFrequent(String[] words, int k) {//1.统计每个单词出现的次数Map<String,Integer> map = new HashMap<>();for (String word : words) {if (map.get(word) == null) {map.put(word,1);}else {int val = map.get(word);map.put(word,val+1);}}//2.建立小根堆,指定比较的方式PriorityQueue<Map.Entry<String,Integer>> minHeap = new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() {@Overridepublic int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {if (o1.getValue().compareTo(o2.getValue()) == 0) {//按照字母顺序建立大根堆return o2.getKey().compareTo(o1.getKey());}return o1.getValue() - o2.getValue();}});//3.遍历map 调整优先级队列for (Map.Entry<String,Integer> entry : map.entrySet()) {if (minHeap.size() < k) {minHeap.offer(entry);}else {Map.Entry<String,Integer> top = minHeap.peek();//如果当前频率相同if (top.getValue().equals(entry.getValue())){//字母顺序小的进来if (top.getKey().compareTo(entry.getKey()) > 0) {minHeap.poll();minHeap.offer(entry);}}else {if (top.getValue().compareTo(entry.getValue()) < 0) {minHeap.poll();minHeap.offer(entry);}}}}List<String> ret = new ArrayList<>();for (int i = 0; i < k; i++) {Map.Entry<String,Integer> top = minHeap.poll();ret.add(top.getKey());}Collections.reverse(ret);return ret;}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/279273.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kakfa实战指引-实时海量流式数据处理

前言 我们最终决定从头开始构建一些东西。我们的想法是&#xff0c;与其专注于保存成堆的数据&#xff0c;如关系数据库、键值存储、搜索索引或缓存&#xff0c;不如专注于将数据视为不断发展和不断增长的流&#xff0c;并围绕这个想法构建一个数据系统——实际上是一个数据架…

日本科学家们使用AI技术首次创造了世界上的心灵影像

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

圆通速递查询,圆通速递单号查询,一键复制查询好的物流信息

批量查询圆通速递单号的物流信息&#xff0c;并将查询好的物流信息一键复制出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&…

网站监控/定时任务/网站网址URL状态监控神器

源码介绍&#xff1a; 这是一款在线监控网址的源码&#xff0c;对于有多个网站的站长来说还是非常有用的。也可以做为一项收费服务对外提供。这个程序没啥问题&#xff0c;就是UI有点简单&#xff0c;不影响使用。 网站监控/定时任务/网站网址URL状态监控神器&#xff0c;可以…

【python】Debian安装miniconda、spyder、tushare

1. miniconda 安装 — 动手学深度学习 2.0.0 documentation中有安装Miniconda的一些说明。 Miniconda — miniconda documentation是Miniconda网站&#xff0c;里面也有安装说明。 Debian安装按照linux安装即可&#xff1a; mkdir -p ~/miniconda3 wget https://repo.anaco…

打开软木塞,我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上&#xff0c;这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗&#xff0c;你喜欢喝的那瓶香槟酒可能根本不是香槟&#xff0c;而是汽酒&#xff1f;你不是唯一一个认…

Python获取去哪儿旅游数据并作可视化攻略

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 开发环境&#xff1a; 版 本&#xff1a; python 3.8 编辑器&#xff1a;pycharm 第三方库&#xff1a; requests >>> pip install requests parsel >>> pip install parsel 模块安装: 按住键盘 win…

centos安装中文字体1.安装字体库

1.安装字体库&#xff08;如果安装&#xff0c;则跳过此步骤&#xff09; yum install fontconfig 2.安装更新字体命令&#xff08;如果安装&#xff0c;则跳过此步骤&#xff09; yum install mkfontscale 3.新建目录&#xff0c;上传中文字体 mkdir /usr/share/fonts/Chine…

【送书活动】智能汽车、自动驾驶、车联网的发展趋势和关键技术

文章目录 前言01 《智能汽车》推荐语 02 《SoC底层软件低功耗系统设计与实现》推荐语 03 《SoC设计指南》推荐语 05 《智能汽车网络安全权威指南&#xff08;上册&#xff09;》推荐语 06 《智能汽车网络安全权威指南&#xff08;下册&#xff09;》推荐语 后记赠书活动 前言 …

调用别人提供的接口无法通过try catch捕获异常(C#),见鬼了

前几天做CA签名这个需求时发现一个很诡异的事情&#xff0c;CA签名调用的接口是由另外一个开发部门的同事(比较难沟通的那种人)封装并提供到我们这边的。我们这边只需要把数据准备好&#xff0c;然后调他封装的接口即可完成签名操作。但在测试过程中&#xff0c;发现他提供的接…

Leetcode—237.删除链表中的节点【中等】

2023每日刷题&#xff08;六十&#xff09; Leetcode—237.删除链表中的节点 偷天换日实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { pub…

高通平台开发系列讲解(USB篇)linux下如何让U盘可以识别问题

文章目录 一、简述二、修改方法三、宏介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 一、简述 对于一些U盘不能自动被Linux内核识别的情况,可能需要进行一些调整和修改内核驱动的设置。 二、修改方法 在kernel中开启以下的宏开关 CONFIG_USB_STORAGE=y CONFIG_SCSI=…