【LeetCode】五、哈希表相关:统计重复元素 + 找不同

文章目录

  • 1、哈希表结构
  • 2、Java中的哈希表
  • 3、leetcode217:统计重复元素
  • 4、leetcode389:找不同
  • 5、leetcode496:下一个更大元素

1、哈希表结构

又叫散列表,存键值对,将key用哈希函数转为数组下标索引

在这里插入图片描述
当两个不同的key经过哈希函数得到相同的结果i,即哈希冲突了

在这里插入图片描述

此时 i 位置就要存两个值,因此,链表出现,如下图中数组下标2的位置:

在这里插入图片描述
时间复杂度:根据key找value,时间复杂度为O(1),但如果有哈希冲突,则时间复杂度为O(k),k为冲突位置链表元素的个数

在这里插入图片描述

2、Java中的哈希表

下面这种用数组表示哈希表的结构,是key为下标索引,value为数组元素的值。重点关注HashMap就行:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、leetcode217:统计重复元素

单论这题要return的结果,其实不借助数据结构,直接for循环遍历,里面再嵌套遍历一次,出现一个相等就直接return true就实现了。下面的解法,重点在有重复元素 + 每个重复元素分别重复了几次

在这里插入图片描述

哈希表的一个常见用途就是统计某个元素或字符出现的次数

在这里插入图片描述
统计思路:遍历数组,如果数组的元素e不在哈希表的key的集合中,则put(e, 1),反之,若在,则get这个key的value,并将其value更新为value+1。 再说这道题,要结果就遍历下HashMap,如果有value大于1的,则return true

public class P217 {

    public static boolean stats(int[] array) {
        if (null == array || array.length == 0) {
            return false;
        }
        Map<Integer, Integer> hashMap = new HashMap<>();
        for (int e : array) {
            if (!hashMap.containsKey(e)) {
                hashMap.put(e, 1);
            } else {
                int count = hashMap.get(e);
                hashMap.put(e, count + 1);
            }
        }
        // 统计完毕了,这里完成下题目的return值
        for (Integer value : hashMap.values()) {
            if (value > 1){
                return true;
            }
        }
        return false;
    }
}

测试:


public class P217 {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 1, 1};
        System.out.println(stats(array));
    }
}

效果:

在这里插入图片描述

4、leetcode389:找不同

在这里插入图片描述

用数组实现,还是哈希表的思路,将每个字母根据ASCII码转为数组下标,数组的值则存其出现的次数。两个注意点:

  • a对应的ASCII码为97,没必要存97的位置,存0,b就存98 - a = 98 - 97 = 1
  • 两个字符串,没必要对应两个数组,用一个,s字符串中的每个字母出现一次就减1,t字符串则加1,如此,最后数量不为1的位置,即为随机添加的那个字母

在这里插入图片描述

实现:

public class P389 {

    public static String findDifference(String t, String s) {
        if (s.length() == 0) {
            return t;
        }
        // 初始化一个空int数组,长度为26,因为最多26个字母
        int[] array = new int[26];
        char[] tArr = t.toCharArray();
        char[] sArr = s.toCharArray();
        for (char i : tArr) {
            // char类型转int即为其ASCII码
            array[(int)i - 97] = array[(int)i - 97] + 1;
        }
        for (char j : sArr) {
            array[(int)j - 97] = array[(int)j - 97] - 1;
        }

        for (int i = 0; i < array.length; i++) {
            if (array[i] > 0) {
                // 找到多余的字母以后,用其索引下标+97转回字符
                return (char)(i + 97) + "";
            }
        }
        return "";
    }
}

测试:

public class P389 {
    public static void main(String[] args) {
        String s = "abcd";
        String t = "abcda";
        System.out.println(findDifference(t, s));
    }
}

在这里插入图片描述
本质还是key-value的哈希表思想,不过是key的特殊性,用数组直接实现了。特别注意这里加一减一的思想,而不是用两个哈希表分别统计。

5、leetcode496:下一个更大元素

在这里插入图片描述

之前用两个栈解决过这题,还可用栈 + 哈希表解决,更加清晰。思路:直接计算num2中每个元素在num2中下一个更大的值,并存入哈希表,key为num2的每个元素,value为该元素的下一个更大的值。如此,遍历num1,直接从哈希表get,就可得到其下一个更大的值
在这里插入图片描述
计算num2中每个元素在num2中下一个更大的值,可借助栈,遍历num2,入栈,当即将入栈的元素a 大于 栈顶元素b的时候,即说明a是b的下一个更大的元素,存入map

public class P496Two {

    public static int[] findMore(int[] num1, int[] num2) {
        if (num1 == null || num2 == null || num1.length == 0 || num2.length == 0){
            return null;
        }
        //结果集
        int[] result = new int[num1.length];
        //栈和哈希表
        Stack<Integer> stack = new Stack<>();
        HashMap<Integer, Integer> map = new HashMap<>();

        // 栈不空,且即将入栈的元素大于栈顶元素的时候
        for (int num : num2) {
            while (stack.size() != 0 && num > stack.peek()) {
                // 即将入栈的元素就是栈顶元素的"下一个更大值",存入map
                Integer key = stack.pop();
                map.put(key, num);
            }
            stack.push(num);
        }

        // 栈里还有元素的话,说明后面没有比它更大的了,统统弹栈,更大的值赋-1
        while (stack.size() != 0) {
            map.put(stack.pop(), -1);
        }

        // 到此,map中存了num2里每个元素的"下一个更大值",返回num1的
        for (int i = 0; i < num1.length; i++) {
            result[i] = map.get(num1[i]);
        }
        return result;

    }
}

测试下:

public class P496Two {

    public static void main(String[] args) {
        int[] num1 = {8, 1, 2};
        int[] num2 = {2, 1, 0, 8, 7, 6, 5};
        for (int i : findMore(num1, num2)) {
            System.out.print(i + " ");
        }
    }
}

在这里插入图片描述

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

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

相关文章

多功能气象传感器的工作原理

TH-WQX9多功能气象传感器是一种集成了多种传感器技术的气象观测装置&#xff0c;旨在同时测量和监测大气中的多个气象要素&#xff0c;以提供全面、准确的气象信息。以下是关于多功能气象传感器的详细介绍&#xff1a; 技术原理 多功能气象传感器采用多种传感器技术相结合&…

[C++][设计模式][原型模式]详细讲解

1.动机 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&#xff1b;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但是它们却拥有比较稳定一致的接口如何应对这种变化&#xff1f;如何向“客户程序(使用这些对象的程序)”隔离出…

【FFmpeg】avformat_alloc_output_context2函数

【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext&#xff08;avformat_alloc_context&#xff09;1.2 格式猜测&#xff08;av_guess_format&#xff09;1.2.1 遍历可用的fmt&#xff08;av_muxer_iterate&#xff0…

正版软件 | DupInOut Duplicate Finder:智能清理,让数据井然有序

在信息爆炸的时代&#xff0c;我们经常面临数据管理的挑战。DupInOut Duplicate Finder 是一款专为Windows 设计的重复文件查找工具&#xff0c;帮您快速识别并删除重复的文档、音乐、视频和照片&#xff0c;让您的计算环境更加清洁、有序。 精准查找&#xff0c;一键删除 DupI…

DM达梦数据库转换、条件函数整理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

硬件开发笔记(二十二):AD21软件中创建元器件AXK5F80337YG原理图库、封装库和3D模型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140007117 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

怎么扫描图片变成pdf格式?办公人士值得收藏的宝藏工具

将图片扫描并转换为PDF格式可以通过多种途径实现&#xff0c;无论是使用专业的扫描仪还是智能手机&#xff0c;都有相应的方法。 PDF 是什么&#xff1f; PDF&#xff0c;全称为 Portable Document Format&#xff08;便携式文档格式&#xff09;&#xff0c;是由Adobe System…

使用宝塔安装ModstartCMS (非一键安装)

操作系统 Linux Windows 推荐 Linux 操作系统&#xff0c;性能比较好 软件环境 稳定版 PHP 5.6 PHP 7.0 MySQL >5.0 PHP Extension&#xff1a;Fileinfo Apache/Nginx Laravel 9.0 版本 PHP 8.1 MySQL >5.0 PHP Extension&#xff1a;Fileinfo Apache/Ngin…

DLS策略洞察:如何应对AI数据中心网络交换机市场的爆发式增长?

摘要&#xff1a; 随着AI技术的发展和应用&#xff0c;AI数据中心对网络交换机的需求日益增加。摩根士丹利预计&#xff0c;2023-2026年间&#xff0c;AI数据中心网络交换机的收入复合年增长率&#xff08;CAGR&#xff09;将达到55%。本文将详细分析AI数据中心网络交换机市场…

Springboot + Mybatis-Plus代码生成指南

使用 Spring Boot 和 MyBatis-Plus 生成代码&#xff0c;可以大大简化开发流程&#xff0c;可以保持编码的规范性&#xff0c;生成单元测试等。以下是详细步骤&#xff1a; 配置pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>myb…

Arcgis 计算经纬度坐标并补齐6位小数

工作中我们经常需要在Arcgis中计算点的经纬度或者线的起点、终点坐标&#xff0c;为确保数据的准确性&#xff0c;我们必须保留6位小数&#xff0c;但我们在默认计算的时候偶尔会遇到算出来的经纬度坐标小数位不足6位&#xff0c;那我们应该如何补齐呢&#xff0c;这里我将方法…

如何不改变 PostgreSQL 列类型#PG培训

开发应用程序并在其背后操作数据库集群时&#xff0c;会遇到一个意想不到的问题是实践与理论、开发环境与生产之间的差异。这种不匹配的一个完美例子就是更改列类型。 #PG考试#postgresql培训#postgresql考试#postgresql认证 关于如何在 PostgreSQL&#xff08;以及其他符合 SQ…

Hugo Barra对Apple Vision Pro 硬件和软件的详细评述

原文&#xff1a;hugo.blog/2024/03/11/vision-pro 这篇文章的作者是Hugo Barra。Hugo Barra曾是Meta公司&#xff08;前身为Facebook&#xff09;旗下Oculus VR/AR团队的负责人。他在2017年至2020年期间领导了Oculus的团队&#xff0c;参与了多个VR头显的开发和发布。Hugo Bar…

MySQL详细介绍:开源关系数据库管理系统的魅力

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

未来20年人工智能将如何塑造社会

照片由Brian McGowan在Unsplash上拍摄 更多资讯&#xff0c;请访问 2img.ai “人工智能会成为我们的救星还是我们的末日&#xff1f;” 几十年来&#xff0c;这个问题一直困扰着哲学家、科学家和科幻爱好者。 当我们踏上技术革命的边缘时&#xff0c;是时候透过水晶球&#x…

从0开始编写VS1053音频解码芯片的底层驱动代码(适用于任何单片机)

VS1053是一个高性能的音频解码器芯片,它是干什么的? 他有两个功能:()用来解码音频文件播放音乐的。(2)将麦克风听到的声音编码成音频文件数据,配合单片机可以保存到SD卡。 单片机加上一个VS1053就可以轻松做一个音乐播放器、一个录音机 等项目。 VS1053支持两种协议:…

Visio文件编辑查看工具:Visio Viewer for Mac 激活版

Visio Viewer 软件通过该软件&#xff0c;用户可以在没有Visio软件的情况下查看使用Visio创建的绘图和图表&#xff0c;方便用户对复杂信息的可视化、分析和交流。Visio Viewer 2007是一个功能强大的软件&#xff0c;它可以帮助IT和商务专业人员轻松地可视化、分析和交流复杂信…

AI论文降重:一键操作,让你的论文查重率瞬间下降

高查重率是许多毕业生的困扰。通常&#xff0c;高查重率源于过度引用未经修改的参考资料和格式错误。传统的降重方法&#xff0c;如修改文本和增添原创内容&#xff0c;虽必要但耗时且成效不一。 鉴于此&#xff0c;应用AI工具进行AIGC降重成为了一个高效的解决方案。这些工具…

PyCharm 2024.1最新变化

PyCharm 2024.1 版本带来了一系列激动人心的新功能和改进&#xff0c;以下是一些主要的更新亮点: Hugging Face 模型和数据集文档预览&#xff1a;在 PyCharm 内部快速获取 Hugging Face 模型或数据集的详细信息&#xff0c;通过鼠标悬停或使用 F1 键打开文档工具窗口来预览。 …

基于springboot、logback的日志脱敏组件

Logback⽇志数据脱敏⼯具&#xff1a;隐私和安全的守护者 概述 在涉及敏感数据的⽇志记录环境中&#xff0c;数据保护和个⼈隐私⽆疑是⾄关重要的领域。确保敏感数据不被泄露&#xff0c;脱敏处理成为必不可少的⼀步。数据脱敏是⼀种技术⼿段&#xff0c;其将敏感信息转换为不…