【代码随想录】哈希表

文章目录

  • 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. 四数之和

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

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

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

相关文章

基于计算机视觉的交通信号违章检测系统(闯红灯违章检测)

Introduce: 该系统可以实时检测交通信号灯违规: 城市中越来越多的汽车会导致大量交通拥堵&#xff0c;这意味着如今在孟加拉国和世界各地&#xff0c;交通违规行为变得更加严重。这造成了严重的财产破坏和更多可能危及人民生命的事故。为了解决令人震惊的问题并防止这种深不可…

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置 SQLAlchemy官方文档地址实战的代码分享数据类型列约束配置自定义方法 SQLAlchemy官方文档地址 SQLAlchemy官方文档地址 实战的代码分享 Flask-SQLAlchemy框架为创建数据库的实例提供了一个基类…

Stirling PDF:免费PDF开源编辑工具

Git地址&#xff1a;https://github.com/Stirling-Tools/Stirling-PDF Stirling-PDF是一个基于spring-boot开发的开源项目&#xff0c;旨在提供一个功能强大的基于Docker的本地托管PDF操作工具。它使您能够对PDF文件进行多种操作&#xff0c;包括拆分、合并、转换、重新组织、…

git系列之--- git pull 和 git fetch理解与区别

标题一般远端仓库里有新的内容更新&#xff0c;当我们需要把新内容下载的时候&#xff0c;就使用到git pull或者git fetch命令 fetch 用法如下&#xff1a; git fetch <远程主机名> <远程分支名>:<本地分支名>例如从远程的origin仓库的master分支下载代码…

如何在 iPhone 15/14/13/12/11/XS/XR 上恢复误删除的短信?

无论你的iPhone功能多么强大&#xff0c;数据丢失的情况仍然时有发生&#xff0c;所以当你发现一些重要的消息有一天丢失了。别担心&#xff0c;让自己冷静下来&#xff0c;然后按照本页的方法轻松从 iPhone 中检索已删除的短信。 在这里&#xff0c;您需要奇客数据恢复iPhone…

2024-4-7 QT day1作业

myWidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\张谦\\Desktop\\pictrue\\qq.png"));//设…

网络——初识网络

在现如今&#xff0c;网络已经成了一种基础设施&#xff0c;大到国家&#xff0c;小到个人&#xff0c;网络已经充斥在我们每个人的身 边&#xff0c;如果一个人突然失去了网络&#xff0c;那么它的生活或多或少会出现一些不方便的地方&#xff0c;网络现在已 经伴随着我们的吃…

【Python-数据类型】

Python-数据类型 ■ 类型简介■ Number&#xff08;数字&#xff09;■ String&#xff08;字符串&#xff09;■ Python 转义字符■ Python 字符串运算符■ Python 字符串格式化■ Python三引号■ f-string ■ bool&#xff08;布尔类型&#xff09;■ List&#xff08;列表&a…

OSPF实例是什么?

OSPF实例是什么&#xff1f; **OSPF实例指的是一个OSPF路由进程&#xff0c;它是在一个设备上运行的单独的OSPF路由协议实体**。 在详细解释这个概念之前&#xff0c;需要了解OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff08;IGP&#x…

【pycharm报错】rror: Microsoft Visual C++ 14.0 or greater is required.

一、报错 二、下载vs 路径&#xff1a;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ 三、安装 四、安装成功并启动 重新安装chromadb成功

如何在 Node.js 中使用 bcrypt 对密码进行哈希处理

在网页开发领域中&#xff0c;安全性至关重要&#xff0c;特别是涉及到用户凭据如密码时。在网页开发中至关重要的一个安全程序是密码哈希处理。 密码哈希处理确保明文密码在数据库受到攻击时也难以被攻击者找到。但并非所有的哈希方法都是一样的&#xff0c;这就是 bcrypt 突…

实战webSocket压测(三)Jmeter真实接口联调

背景&#xff1a; 接口地址为&#xff1a;ws://sunlei.demo 接口说明&#xff1a;websocket接口&#xff0c;首次连接&#xff0c;通过Text请求设置开启标志&#xff0c;然后通过wav文件流传输&#xff0c;达到后端服务可以根据传输信息进行解析满足指定标准后&#xff0c;web…

【Linux】有关时间的命令(date、timedatectl)

专栏文章索引&#xff1a;Linux 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、data命令 1.介绍 2.常用参数 3.常用选项 二、timedatectl命令 1.介绍 2.常用子命令 一、data命令 1.介绍 date命令用于显示或设置系统的时间与日期&#xff0c;语法格式为&a…

前端:SVG绘制流程图

效果 代码 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>SVG流程图示例</title><style>/* CSS 样式 */</style><script src"js/index.js"></script…

设计模式浅析(十) ·设计模式之迭代器组合模式

设计模式浅析(十) 设计模式之迭代器&组合模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 案例 有两家门店&#xff0c;门店A呢只提供早餐&#xff0c;门店B呢只提供午…

IntelliJ IDEA 2024.1 更新亮点汇总:全面提升开发体验

IntelliJ IDEA 2024.1 更新亮点汇总&#xff1a;全面提升开发体验 文章目录 IntelliJ IDEA 2024.1 更新亮点汇总&#xff1a;全面提升开发体验摘要引言 IntelliJ IDEA 2024.1 的新增功能主要亮点全行代码完成 最终的支持 Java 22 功能新航站楼 贝塔编辑器中的粘滞线 人工智能助…

2024新版PHP在线客服系统多商户AI智能在线客服系统源码机器人自动回复即时通讯聊天系统源码PC+H5

搭建环境&#xff1a; 服务器 CPU 2核心 ↑ 运存 2G ↑ 宽带 5M ↑ 服务器操作系统 Linux Centos7.6-7.9 ↑ 运行环境&#xff1a; 宝塔面板 Nginx1.18- 1.22 PHP 7.1-7.3 MYSQL 5.6 -5.7 朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持…

深入浅出 -- 系统架构之负载均衡Nginx实现高可用

一、Nginx的高可用 线上如果采用单个节点的方式部署Nginx&#xff0c;难免会出现天灾人祸&#xff0c;比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭....哈哈哈&#xff0c;夸张了。但实际生产环境中确实存在隐患问题&#xff0c;由于Nginx作为整个系统的网关层接入…

图解Java23种设计模式

好代码与烂代码 对代码质量的评判不能依据笼统的感觉&#xff0c;而是根据精准的标准去判断 我们应该从以下角度去判断自己写的代码到底是不是屎山&#xff1a; 可维护性&#xff08;Maintainability&#xff09;&#xff1a;能够以最小的成本和最快的速度修改或优化代码。可维…

git bash上传文件至github仓库

Linux运维工具-ywtool 目录 一.访问github二.新建仓库1.点击自己头像2.选择"your repositories"3.点击"New"4.创建新仓库 三.通过git bash软件上传文件1.提示2.打开git bash软件3.切换到本地仓库目录4.配置github的用户名和邮箱信息5.生成SSH Key6.github添…