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

news2024/11/24 3:09:57

文章目录

  • 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 + " ");
        }
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代码安全】如何通过实现代码加密与魔改Python,防止代码泄露、恶意窃取

如何通过实现代码加密与魔改Python&#xff0c;防止代码泄露、恶意窃取 文章目录 如何通过实现代码加密与魔改Python&#xff0c;防止代码泄露、恶意窃取前言概述代码运行演示Step 0: 正常代码运行Step 1: 代码加密Step 2: 加密代码在魔改环境运行Step 3: 加密代码在正常环境运…

数字孪生如何赋能智慧加油站?

在当今数字化转型的浪潮中&#xff0c;智慧城市的构建正以前所未有的速度推进&#xff0c;而智慧加油站作为智慧城市生态系统的重要组成部分&#xff0c;其升级转型显得尤为重要。随着国家“十四五”规划对智慧城市和数字化建设的明确指引&#xff0c;以及“碳达峰、碳中和”目…

51WORLD发布电力行业输电网自动生成与GIM解析技术,引领智慧电网加速进化!

电力行业是国民经济发展的重要支柱性产业。近年来&#xff0c;5G、大数据、人工智能、数字孪生等新技术新应用的高速发展&#xff0c;数字化、智能化已成为传统电力行业转型发展的重要方向。 大趋势下&#xff0c;以智能电网等为代表的新业态、新模式、新技术蓬勃兴起&#xf…

PyTorch入门:探索Tensor的基本操作(2)

torch.cat&#xff08;&#xff09; a torch.zeros((2,4)) b torch.ones((2,4)) out torch.cat((a,b), dim1) print(out)运行结果如下&#xff1a; tensor([[0., 0., 0., 0., 1., 1., 1., 1.],[0., 0., 0., 0., 1., 1., 1., 1.]])torch.stack&#xff08;&#xff09;&…

分析零信任三大产品板块的发展

众所周知&#xff0c;增强型身份管理&#xff08;IAM&#xff09;、软件定义边界&#xff08;SDP&#xff09;和微隔离&#xff08;MSG&#xff09;是零信任的三大支撑技术。在中国市场&#xff0c;零信任的产品板块也按照这三大技术进行划分。2023年&#xff0c;IAM、SDP和MSG…

PageOffice国产版在线编辑word文件

PageOffice国产版支持统信UOS、银河麒麟等国产操作系统。调用客户端WPS在线编辑word、excel、ppt等文件。在线编辑效果与本地WPS一致。如图所示&#xff1a; web系统集成pageofficeV6.0国产版的文档&#xff1a;PageOfficeV6.0国产版最简集成代码(Springboot) PageOffice最简集…

linux的安全技术和防火墙

一、安全技术 1.入侵检测系统&#xff1a;特点式不阻断网络访问&#xff0c;主要式提供报警和事后监督&#xff0c;不主动介入&#xff0c;默默的看着你&#xff08;相当于360安全卫士&#xff09; 2.入侵防御系统&#xff1a;透明模式工作&#xff0c;对数据包&#xff0c;网…

Micrometer+ZipKin分布式链路追踪

目录 背景MicrometerMicrometer与ZipKin之间的关系专业术语分布式链路追踪原理 ZipKin安装下载 MicrometerZipKin 案例演示相关文献 背景 一个系统页面上的按钮点击到结果反馈&#xff0c;在微服务框架里&#xff0c;是由N个服务组成返回结果&#xff0c;中间可能经过a->b-…

【数据结构与算法】哈希表 详解

开放定址哈希表的存储结构是什么样的&#xff1f; 开放定址哈希表的存储结构&#xff1a; #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1int hashsize[] {997, /*...*/}; // 哈希表容量递增表&#xff0c;一个合适的素数序列typedef struct {ElemType *elem;…

Anisble Playbook

文章目录 一、Playbook简介三种常见的数据格式Playbook特点YAML语言介绍 二、Playbook核心组件host组件remote_user组件task列表和action组件gather_factsHandlers notifyignore_errors 三、playbook命令playbook命令tags 标签 四、Playbook中的变量setup模块中的变量Playbook命…

【Unity】Excel配置工具

1、功能介绍 通过Excel表配置表数据&#xff0c;一键生成对应Excel配置表的数据结构类、数据容器类、已经二进制数据文件&#xff0c;加载二进制数据文件获取所有表数据 需要使用Excel读取的dll包 2、关键代码 2.1 ExcelTool类 实现一键生成Excel配置表的数据结构类、数据…

linux系统中vim ls grep等命令无法使用

linux突然vim ls grep等命令无法使用 系统配置路径被修改导致无法使用 添加路径 执行以下命令 export PATH$PATH:/root/bin export PATH$PATH:/usr/sbin

如何在信创领域中做好防泄露

随着信息技术的迅猛发展&#xff0c;数据安全和防泄露成为了企业和政府机构面临的重大挑战。在信创&#xff08;Creative and Innovative Intelligent Products&#xff09;领域中&#xff0c;沙箱技术以其独特的隔离和保护机制&#xff0c;成为了防泄露的关键手段之一。 一、沙…

一文带你了解什么是【点击劫持】

点击劫持&#xff0c;意思就是你点击网页的时候&#xff0c;有人劫持你&#xff0c;对没错&#xff0c;劫持你的信息&#xff0c;甚至劫持你的马内&#xff0c;劫持你的理想&#xff0c;劫持你的肉体&#xff0c;劫持你的灵魂。就是这么可怕。 目录 1 如何实现假网站 1.1 if…

祝贺!FISCO BCOS伙伴科大讯飞获国家科学技术进步奖一等奖

6月24日&#xff0c;2023年度国家科学技术奖励大会在京召开&#xff0c;金链盟理事单位、开源工作组成员单位、FISCO BCOS产业应用合作伙伴科大讯飞作为第一完成单位的“多语种智能语音关键技术及产业化”项目获得国家科学技术进步奖一等奖。 这是深度学习引发全球人工智能浪潮…

[计算机网络] 虚拟局域网

虚拟局域网 VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是将一个物理的局域网在逻辑上划分成多个广播域的技术。 通过在交换机上配置VLAN&#xff0c;可以实现在同一个VLAN 内的用户可以进行二层互访&#xff0c;而不同VLAN 间的用户被二…

如何利用静力水准仪进行地形沉降测量

地形沉降测量在建筑工程和地质研究中起着至关重要的作用。准确的地形沉降测量可以帮助工程师预测和预防潜在的地基问题&#xff0c;从而保障建筑物的安全和稳定。本文将详细介绍如何利用静力水准仪进行地形沉降测量&#xff0c;并探讨其在实际应用中的优势。 静力水准仪的基本原…

线程池FutureTask浅谈

一,概述 FuturnTask实现了Future与Runnable接口,笔者知道,ThreadPoolExecutor#submit可以传入Callable接口而非Runnable,区别点在于Callable可以返回值,而整个FuturnTask可以理解为Callable设计,用来优雅地异步获取执行结果,无需手动Condition去实现。 围绕此,需知道…

碧海威L7云路由无线运营版 confirm.php/jumper.php 命令注入漏洞复现(XVE-2024-15716)

0x01 产品简介 碧海威L7网络设备是 北京智慧云巅科技有限公司下的产品,基于国产化ARM硬件平台,采用软硬一体协同设计方案,释放出产品最大效能,具有高性能,高扩展,产品性能强劲,具备万兆吞吐能力,支持上万用户同时在线等高性能。其采用简单清晰的可视化WEB管理界面,支持…

Aigtek:为何要使用电压放大器

电压放大器在现代电子技术中起到了至关重要的作用。它是一种电子设备&#xff0c;用于将输入信号的电压增大到所需的输出电压水平。电压放大器的使用有以下几个方面的原因和优势。 电压放大器可以提高信号的强度和质量。许多实际应用中的输入信号往往很微弱&#xff0c;比如来自…