【代码随想录】哈希表

news2024/11/16 16:54:15

文章目录

  • 242.有效的字母异位词
  • 349. 两个数组的交集
  • 202. 快乐数
  • 1. 两数之和
  • 454. 四数相加 II
  • 383. 赎金信
  • 15. 三数之和
  • 18. 四数之和

242.有效的字母异位词

在这里插入图片描述

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s==null || t==null || s.length()!=t.length()){
            return false;
        }
        Map<Character, Integer> mapS=strToMap(s);
        Map<Character, Integer> mapT=strToMap(t);
        return mapS.equals(mapT);
    }
    private Map<Character, Integer> strToMap(String str){
        Map<Character, Integer> map = new HashMap<>();
        for(int i=0;i<str.length();i++){
            char ch=str.charAt(i);
            // if(map.containsKey(ch)){
            //     map.put(ch,map.get(ch)+1);
            // }else{
            //     map.put(ch,1);
            // }
            map.put(ch, map.getOrDefault(ch,0)+1);
        }
        return map;
    }
}

为什么用下面的代码代替 equals() 方法来判断两个 Map 的内容是否相等时,会有一个测试用例不通过?

for(Map.Entry<Character, Integer> entry:mapS.entrySet()){
    Character keyS=entry.getKey();
    Integer valueS=entry.getValue();
    if(!mapT.containsKey(keyS) || mapT.get(keyS)!=valueS){
        return false;
    }
}

在这里插入图片描述

349. 两个数组的交集

在这里插入图片描述

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1==null || nums2==null){
            return null;
        }
        // 分别将两个数组转成Set集合,去重
        Set<Integer> set1=new HashSet<>();
        for(int i=0;i<nums1.length;i++){
            set1.add(nums1[i]);
        }
        Set<Integer> set2=new HashSet<>();
        for(int i=0;i<nums2.length;i++){
            set2.add(nums2[i]);
        }
		//求set1与set2的交集,交集保存在set1中
		//retainAll:保留两者都有的
        set1.retainAll(set2);
        int[] num=new int[set1.size()];
        int j=0;
        for(Integer item:set1){
            num[j++]=item;
        }
        return num;
    }
}

202. 快乐数

在这里插入图片描述

class Solution {
    public boolean isHappy(int n) {
        // 将正整数n的每一位放入List集合,升序排列
        List<Integer> list = getNewList(n);

        Set<List> set=new HashSet<>();
        int sum=-1;
        while(true){
            if(set.contains(list)){
                return false;
            }
            sum=listSum(list);
            if(sum==1){
                return true;
            }
            else{
                set.add(list);
                list=getNewList(sum);
            }
        }
    }
    private List<Integer> getNewList(int num){
        List<Integer> list = new ArrayList<>();
        while(num/10!=0){
            int modRes=num%10;
            list.add(modRes);
            num/=10;
        }
        list.add(num); 
        Collections.sort(list);
        return list;
    }
    private int listSum(List<Integer> list){
        int sum=0;
        for (Integer item : list) {
            sum+=item*item;
        }
        return sum;
    }
}

1. 两数之和

在这里插入图片描述

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            // 要在数组元素还未进Map集合时判断Map中是否有target-nums[i])
            if(map.containsKey(target-nums[i])){
                return new int[]{map.get(target-nums[i]), i};
            }
            //Map中,key是数组元素值,value是元素在数组中的下标
            map.put(nums[i],i);
        }
        return null;
    }
}

454. 四数相加 II

在这里插入图片描述

思路:将四个数组分为两组处理。

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map=new HashMap<>();
        for(int i=0;i<nums1.length;i++){
            for(int j=0;j<nums2.length;j++){
                int sum = nums1[i]+nums2[j];
                map.put(sum, map.getOrDefault(sum, 0)+1);
            }
        }
        int count=0;
        for(int i=0;i<nums3.length;i++){
            for(int j=0;j<nums4.length;j++){
                int sum = nums3[i]+nums4[j];
                if(map.containsKey(-sum)){
                    count+=map.get(-sum);
                }
            }
        }
        return count;
    }
}

383. 赎金信

在这里插入图片描述

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 将magazine中的字符以及对应出现的频率记录到Map中
        Map<Character,Integer> map=new HashMap<>();
        for(int i=0;i<magazine.length();i++){
            map.put(magazine.charAt(i),map.getOrDefault(magazine.charAt(i),0)+1);
        } 
        for(int i=0;i<ransomNote.length();i++){
            char currentCh = ransomNote.charAt(i);
            if(!map.containsKey(currentCh)){
                return false;
            }else{
                map.put(currentCh,map.get(currentCh)-1);
                if(map.get(currentCh)==0){
                    map.remove(currentCh);
                }
            }
        }
        return true;
    }
}

15. 三数之和

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

用了哈希表,时间超限,据说用排序+双指针思路简单且可行,后面刷到双指针的题再完成这个方法的题解。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        // key:两个元素的和    value:所有和等于key的元素组合,以下标的形式记录
        Map<Integer, List<List<Integer>>> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                // 将前两个元素包装到List中
                List<Integer> innerList=new ArrayList<>();
                innerList.add(i);
                innerList.add(j);

                int key=nums[i]+nums[j];
                if(!map.containsKey(key)){
                    List<List<Integer>> outerList=new ArrayList<>();                
                    outerList.add(innerList);
                    map.put(key, outerList);
                }else{
                    map.get(key).add(innerList);
                }
            }
        }
        Set<List<Integer>> resSet=new HashSet<>();  
        for(int k=0;k<nums.length;k++){
            if(map.containsKey(-nums[k])){
                List<List<Integer>> outerList=map.get(-nums[k]);
                for(List<Integer> innerList : outerList){
                    if(!innerList.contains(k)){
                        List<Integer> innerResList=new ArrayList<>();
                        innerResList.add(nums[innerList.get(0)]);
                        innerResList.add(nums[innerList.get(1)]);
                        innerResList.add(nums[k]);
                        Collections.sort(innerResList);
                        resSet.add(innerResList);
                    }
                }
            }
        }
        return new ArrayList<>(resSet);
    }
}

18. 四数之和

在这里插入图片描述
跟三数之和一样,也是排序+双指针,刷到双指针再做。

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

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

相关文章

Linux信号机制:进程间高效传递事件与操控指令的桥梁

在Linux操作系统中&#xff0c;信号是一种进程间通信机制&#xff0c;用于通知进程某些事件的发生或请求进程执行特定的动作。信号分为两类&#xff1a;编号1至31的传统UNIX信号&#xff0c;被称为不可靠信号&#xff0c;以及编号32至63的扩展信号&#xff0c;即可靠信号&#…

CMU15/445 2023 Spring-project1 LRU-K 替换策略

在写个demo之前&#xff0c;专门学习了LRU:【LeetCode刷题】146. LRU 缓存-CSDN博客 使用哈希表 双向链表可以满足删除/增加的时间复杂度为O(1)。 在通读完15/445这块的说明之后&#xff0c;发现和LRU还是有些差别的。 官方文档中对LRU-K的解释是&#xff1a;LRU-K算法根据所…

LABVIEW--正弦+高斯噪声信号及滤波

前面板信号 后面板 LABVIEW源程序链接&#xff1a;https://pan.baidu.com/s/11B-75i4fHZwWQyjxn9yCyQ?pwd7tfj 提取码&#xff1a;7tfj

JavaWeb--JavaScript Part 01

1. JavaScript概述 JavaScript&#xff08;简称JS&#xff09;是一种轻量级的、解释执行的客户端脚本语言&#xff0c;主要用于增强网页的交互性和动态性。它起源于Netscape的LiveScript&#xff0c;并在1995年发布时更名为JavaScript。尽管名称中包含"Java"&#xf…

2024.4.3-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

时序预测 | Python实现BiGRU-RELM时间序列预测

时序预测 | Python实现BiGRU-RELM时间序列预测 目录 时序预测 | Python实现BiGRU-RELM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BiGRU-RELM时间序列预测分析 将BiGRU和RELM两种模型进行了融合&#xff0c;BiGRU进行预测&#xff0c;RELM对BiGRU模型的预…

LED点阵屏与LCD1602

目录 LED点阵屏 点阵屏的介绍 LED点阵屏分类 点阵屏的显示原理 点阵案例 静态案例 电路图 keil文件 动态案例 电路图 keil文件 LCD1602 LCD1602概述 LCD1602内部结构 存储器结构 LCD引脚及应用电路 时序结构 LCD1602指令集 LCD1602编程 初始化 显示字符 …

使用libibverbs构建RDMA应用

本文是对论文Dissecting a Small InfiniBand Application Using the Verbs API所做的中英文对照翻译 Dissecting a Small InfiniBand Application Using the Verbs API Gregory Kerr∗ College of Computer and Information ScienceNortheastern UniversityBoston, MAkerrgccs…

三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型

测绘行业测绘行业一直是高度技术化的领域&#xff0c;其重要性在于为建设、规划和资源管理提供准确的地理数据。然而&#xff0c;随着技术的发展&#xff0c;传统的测绘方法已经难以满足对数据精度和实时性的要求。因此&#xff0c;测绘行业正逐渐向数字化转型&#xff0c;采用…

唯美首页纯静态html5引导页源码,格子化win8风格官方引导页面源码

唯美首页纯静态html5引导页源码&#xff0c;格子化win8风格官方引导页面源码&#xff0c;喜欢的朋友可以拿去使用 源码下载 唯美首页纯静态html5引导页源码

Rust 基础语法和数据类型

数据类型 Rust提供了一系列的基本数据类型&#xff0c;包括整型&#xff08;如i32、u32&#xff09;、浮点型&#xff08;如f32、f64&#xff09;、布尔类型&#xff08;bool&#xff09;和字符类型&#xff08;char&#xff09;。此外&#xff0c;Rust还提供了原生数组、元组…

记忆的方法 简单易行的记忆技巧:归纳整理,联想,重点标注压缩,改错,留痕记念(去个地方买个特别能长久保留的纪念品),差异

记忆的方法有很多&#xff0c;以下是一些简单易行的记忆技巧&#xff1a; 分类整理&#xff1a;将需要记忆的信息进行分类&#xff0c;这样可以帮助你更好地组织和记忆信息。例如&#xff0c;尝试记住一组词语时&#xff0c;可以将它们按照类别或相关性分组。归纳整理。间隔重…

mysql的安装和部署

##官网下载mysql 我下载的是一个mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 可以通过xshell 或者xftp传送 xshell则是先下载一个lrzsz 执行以下的命令 yum install lrzsz -y #安装好我下面有个一键安装的脚本 #!/bin/bash#解决软件的依赖关系 yum install cmake ncurses…

LangChain学习笔记—RAG(检索增强生成)

LangChain LangChain是一个软件开发框架&#xff0c;可以更轻松地使用大型语言模型&#xff08;LLM&#xff09;创建应用程序。它是一个具有 Python 和 JavaScript 代码库的开源工具。LangChain 允许开发人员将 GPT-4 等 LLM 与外部数据相结合&#xff0c;为聊天机器人、代码理…

代理IP在爬虫中的连接复用与开销减少

目录 一、引言 二、代理IP的基本概念 三、代理IP在爬虫中的使用 四、代理IP的连接复用 五、减少开销的策略 六、代码示例与注释 七、总结 一、引言 在爬虫开发中&#xff0c;代理IP的使用是常见的做法&#xff0c;尤其在目标网站设置了反爬虫机制时。代理IP能够帮助爬虫…

【鸿蒙 HarmonyOS】获取设备的地理位置

一、背景 获取移动设备的地理位置&#xff0c;包含&#xff1a;经度、维度、具体地理位置等&#xff0c;地理位置信息能在许多业务场景中被应用&#xff0c;如导航、地图服务、位置服务、社交媒体等。 下面以一个Demo例子&#xff0c;来实现获取设备地理位置的功能 官方文档…

27.WEB渗透测试-数据传输与加解密(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;26.WEB渗透测试-BurpSuite&#xff08;五&#xff09; BP抓包网站网址&#xff1a;http:…

经济学 赋税

赋税&#xff1a; 1.为政府服务提供金钱来源 2. 用于保护环境 3.帮助国家使用财政和货币政策&#xff0c;推动经济增长 4.再分配社会财富的一种方式&#xff0c;平衡富人和穷人的贫富差距 5.帮助我们支付市场自身可能无法实现的服务&#xff0c;比如公共安全&#xff0c;国…

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点&#xff1a; 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…

全力推进Copilot,微软抽调Teams团队精英

据 Business Insider 网站报道&#xff0c;他们获得的一份俺们微软内部备忘录显示&#xff0c;说俺们微软正在建立一个专门团队&#xff0c;负责俺们家的 Copilot 及其相关产品的后续开发工作。 该备忘录由俺们微软人工智能业务副总裁贾里德・斯帕塔罗&#xff08;Jared Spata…