数据结构 之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>>() {
            @Override
            public 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.mfbz.cn/a/250234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UGUI 鼠标悬浮UI出现弹框,鼠标在图片边缘出现闪烁

1、背景&#xff1a;鼠标悬浮在UI上出现提示框 public class SpecialParam_list : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {public void OnPointerEnter(PointerEventData eventData){TipBox.Instance.ShowBox(Input.mousePosition, value);}public void …

【从零开始学习--设计模式--代理模式】

返回首页 前言 感谢各位同学的关注与支持&#xff0c;我会一直更新此专题&#xff0c;竭尽所能整理出更为详细的内容分享给大家&#xff0c;但碍于时间及精力有限&#xff0c;代码分享较少&#xff0c;后续会把所有代码示例整理到github&#xff0c;敬请期待。 此章节介绍建…

基于中小微企业_个体工商户的信贷评分卡模型和用户画像(论文_专利_银行调研建模使用)

背景介绍 信用贷款是指由银行或其他金融机构向中小微企业和个体工商户提供的一种贷款产品。该贷款的特点是无需提供抵押品或担保&#xff0c;主要依据借款人的信用状况来进行评估和审批。 中小微企业和个体工商户信用贷款的申请流程相对简单&#xff0c;申请人只需要提供个人…

飞天使-docker知识点6-容器dockerfile各项名词解释

文章目录 docker的小技巧dockerfile容器为什么会出现启动了不暂停查看docker 网桥相关信息 docker 数据卷 docker的小技巧 [rootlight-test playbook-vars[]# docker inspect -f "{{.NetworkSettings.IPAddress}}" d3a9ae03ae5f 172.17.0.4docker d3a9ae03ae5f:/etc…

测试用例设计方法之判定表详解!!

理论部分 判定表是分析和表达多种输入条件下系统执行不同动作的工具&#xff0c;它可以把复杂的逻辑关系和多种 条件组合的情况表达得既具体又明确。 条件桩(Condition Stub)动作桩(Action Stub&#xff09;条件项(Condition Entry&#xff09;动作项(Action Entry&#xff0…

python+requests+pytest 接口自动化实现

最近工作之余拿公司的项目写了一个接口测试框架&#xff0c;功能还不是很完善&#xff0c;算是抛砖引玉了&#xff0c;欢迎各位来吐槽。 主要思路&#xff1a; ①对 requests 进行二次封装&#xff0c;做到定制化效果 ②使用 excel 存放接口请求数据&#xff0c;作为数据驱动 ③…

配电房环境监测模块

配电房环境监测模块是一个智能系统&#xff0c;依托电易云-智慧电力物联网平台&#xff0c;旨在实时监控配电房内部的环境参数&#xff0c;以确保配电设备的正常运行。该模块包括以下功能&#xff1a; 温度监测&#xff1a;对配电房内的温度进行实时监测&#xff0c;防止因温度…

CSS 基础

文章目录 CSS 常见的属性CSS 常见样式行内样式内嵌样式导入样式 CSS 选择器标签选择器id选择器类选择器全局选择器属性选择器组合选择器 CSS 常见应用表格列表导航栏下拉菜单提示工具图片廊 CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用…

Pytorch当中的.detach()操作是什么意思

.detach() 是 PyTorch 中用于从计算图中分离张量的方法。当我们在PyTorch中进行张量运算时&#xff0c;操作会构建一个计算图来跟踪计算历史&#xff0c;这个计算图用于自动求导和反向传播来计算梯度。 使用.detach()方法可以将一个张量从当前的计算图中分离出来&#xff0c;使…

【C语言】动态内存管理(C语言的难点与精华,数据结构的前置知识,你真的掌握了吗?)

文章目录 引言一、为什么要动态内存分配二、动态内存分配的相关函数2.1 malloc2.2 free2.3 calloc2.4 realloc 三、常见的动态内存的错误3.1 对NULL指针的解引用3.2 对动态内存越界访问3.3 对非动态内存释放3.4 对动态内存部分释放3.5 对动态内存多次释放3.6 未对动态内存释放&…

Unity中Shader URP的安装与设置

文章目录 前言一、URP安装1、Window -> Project Manager -> 搜索 Render 二、URP设置1、创建一个URP配置文件2、渲染管线的修改&#xff08;当为空时&#xff0c;使用的是 BuildIn Render Pipeline&#xff09;3、这时我们新建一个对象。使用的材质球默认使用 URP 默认Sh…

【JAVA面向对象练习】---第四天

数据求和类 定义一个类Demo,其中定义一个求两个数据和的方法&#xff0c;定义一个测试了Test&#xff0c;进行测试。 package com.fuhai.day04;public class Sum {private double a;private double b;public double getA() {return a;}public void setA(double a) {this.a a…

AE-制作绚丽的图形通道

目录 1.新建合成命名为四边形 2.在合成中新建纯色层命名为tao 3.在纯色层上添加RG Trapcode –>Tao 效果&#xff0c;设置Segment参数 4. 在合成中添加摄像机 5.设置Tao Repeat Paths 相关参数&#xff0c;并调整摄像机的位置 6.设置Tao的 Material & Lighting 等…

系列一、Linux中安装MySQL

一、Linux中安装MySQL 1.1、下载MySQL安装包 官网&#xff1a;https://dev.mysql.com/downloads/file/?id523327 我分享的&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/188_9RnBYlWVzFb_UJH5aaQ?pwdyyds 提取码&#xff1a;yyds 1.2、上传至/opt目录 & 解压…

【每日一题】统计区间中的整数数目

文章目录 Tag题目来源解题思路方法一&#xff1a;平衡二叉搜索树 写在最后 Tag 【平衡二叉搜索树】【设计类】【2023-12-16】 题目来源 2276. 统计区间中的整数数目 解题思路 方法一&#xff1a;平衡二叉搜索树 思路 用一棵平衡二叉搜索树维护插入的区间&#xff0c;树中的…

【Qt开发流程】之网络编程:`HTTP`和`FTP`的高级网络操作

概述 Qt Network模块提供了可以编写TCP/IP客户端和服务器的类。它提供了较低层次的类&#xff0c;如QTcpSocket、QTcpServer和QUdpSocket&#xff0c;来代表低层次网络概念&#xff0c;以及高级层次类&#xff0c;如QNetworkRequest、QNetworkReply和QNetworkAccessManager&am…

CSS对文本的简单修饰

CSS格式&#xff1a; 格式一&#xff1a;在head中的style标签范围内。 < style> 在style内的只写名字不写 &#xff1a; < > 选择器 { 属性的名称 &#xff1a; 样式&#xff1b; 属性的名称&#xff1a;样式&#xff1b; } < style> style中的注释用/* *…

前端如何设置模板参数

1.背景&#xff1a; 最近接到一个需求&#xff0c;在一个类似chatGpt的聊天工具中&#xff0c;要在对话框中设置模板&#xff0c;后端提供了很多模板参数&#xff0c;然后要求将后端返回的特殊字符转成按钮&#xff0c;编辑完成后在相应的位置拼接成字符串。 2.效果&#xff1a…

关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

关于嵌入式开发的一些信息汇总&#xff1a;嵌入式C开发人员、嵌入式系统Linux 1 关于嵌入式 C 开发人员1.1 嵌入式 C 开发人员必须具备的一些基本技能是&#xff1a;1.2 嵌入式C开发的应用案例 2 如何学习用于嵌入式系统的 Linux2.1 如何学习Linux2.1.1 第一步&#xff1a;创建…

openGauss学习笔记-155 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-概述

文章目录 openGauss学习笔记-155 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-概述155.1 概述155.2 注意事项 openGauss学习笔记-155 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-概述 155.1 概述 op…
最新文章