LeetCode刷题笔记之哈希表

一、字母异位词-判断两个参数内容出现的次数是否相等

滑动窗口、数组排序、计数法、哈希表

1. 242【有效的字母异位词】

  • 题目: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
    注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
  • 代码:
    方法一:哈希表法
class Solution {public boolean isAnagram(String s, String t) {//s和t中每个字符出现的次数都相同,也就是说s和t的长度肯定相同if(s.length() != t.length()){return false;}HashMap<Character,Integer> map = new HashMap<>();for (int i = 0; i < s.length(); i++) {map.put(s.charAt(i),map.getOrDefault(s.charAt(i),0)+1);map.put(t.charAt(i),map.getOrDefault(t.charAt(i),0)-1);}//若t与s有不同的字符,或相同字符的个数不同,则map中必有value<0的数for (Integer value : map.values()) {if(value < 0){return false;}}return true;}
}

方法二:排序法

class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) {return false;}//s和t中每个字符出现的次数都相同,则其转换为字符数组并排序后,两数组相等char[] str1 = s.toCharArray();char[] str2 = t.toCharArray();Arrays.sort(str1);Arrays.sort(str2);return Arrays.equals(str1, str2);}
}

2. 383【赎金信】

  • 题目: 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。
    magazine 中的每个字符只能在 ransomNote 中使用一次。
  • 代码:
class Solution {public boolean canConstruct(String ransomNote, String magazine) {HashMap<Character,Integer> map = new HashMap<>();//先遍历magazine,统计可用字符及其个数for (int i = 0; i < magazine.length(); i++) {char ch = magazine.charAt(i);map.put(ch,map.getOrDefault(ch,0)+1);}for (int i = 0; i < ransomNote.length(); i++) {char ch = ransomNote.charAt(i);map.put(ch,map.getOrDefault(ch,0)-1);if(map.get(ch) < 0){return false;}}return true;}
}

3. 49【字母异位词分组】

  • 题目: 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
    字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
    示例 1:
    输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
    输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
  • 代码:
    方法一:排序法
class Solution {public List<List<String>> groupAnagrams(String[] strs) {//将字符串数组中的每个字符串转换成字符数组,并排序,以排序后字符数组组成的字符串为key,具有相同字母的字符串组成的list为value。HashMap<String,List<String>> map = new HashMap<>();for (String s: strs) {char[] charArr = s.toCharArray();Arrays.sort(charArr);String str = String.valueOf(charArr);List<String> list = map.getOrDefault(str,new ArrayList<>());list.add(s);map.put(str,list);}List<List<String>> ansList = new ArrayList<>(map.values());return ansList;}
}

方法一:排序法

class Solution {public List<List<String>> groupAnagrams(String[] strs) {//将字符串数组中的每个字符串转换成字符数组,并排序,以排序后字符数组组成的字符串为key,具有相同字母的字符串组成的list为value。HashMap<String,List<String>> map = new HashMap<>();for (String s: strs) {char[] charArr = s.toCharArray();Arrays.sort(charArr);String str = String.valueOf(charArr);List<String> list = map.getOrDefault(str,new ArrayList<>());list.add(s);map.put(str,list);}List<List<String>> ansList = new ArrayList<>(map.values());return ansList;}
}

4. 438【找到字符串中所有字母异位词】

  • 题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
  • 代码:
    方法一:排序法
class Solution {public List<Integer> findAnagrams(String s, String p) {//首先考虑长度关系if(s.length() < p.length()){return new ArrayList<Integer>();}//排序法char[] charArr = p.toCharArray();Arrays.sort(charArr);String tmp = String.valueOf(charArr);int j = 0;List<Integer> list = new ArrayList<>();for (int i = 0; i < s.length(); i++) {if(i-j+1 == p.length()){String str = s.substring(j,i+1);char[] c = str.toCharArray();Arrays.sort(c);str = String.valueOf(c);if(str.equals(tmp)){list.add(j);}j++;}}return list;}
}

方法二:计数法

class Solution {public List<Integer> findAnagrams(String s, String p) {if(s.length() < p.length()){return new ArrayList<>();}List<Integer> list = new ArrayList<>();//记录p中每个字符的个数int[] pCount = new int[26];//记录s中每个字符的个数int[] sCount = new int[26];for (int i = 0; i < p.length(); i++) {pCount[p.charAt(i)-'a']++;}int j = 0;for (int i = 0; i < s.length(); i++) {sCount[s.charAt(i)-'a']++;if(i-j+1 == p.length()){if(Arrays.equals(pCount,sCount)){list.add(j);}sCount[s.charAt(j)-'a']--;j++;}}return list;}
}

二、数组的交集

1. 349【两个数组的交集】

  • 题目: 给定两个数组 nums1 和 nums2 ,返回它们的交集 。输出结果中的每个元素一定是唯一 的。我们可以不考虑输出结果的顺序 。
  • 代码:
class Solution {public int[] intersection(int[] nums1, int[] nums2) {//题目中交集的意思是nums1与nums2共有的数,结果是不可重复的、无序的,因此可以使用HashSet存储Set<Integer> set1 = new HashSet<>();Set<Integer> set2 = new HashSet<>();Set<Integer> set3 = new HashSet<>();for (int i = 0; i < nums1.length; i++) {set1.add(nums1[i]);}for (int i = 0; i < nums2.length; i++) {set2.add(nums2[i]);}for(Integer i : set1){if(set2.contains(i)){set3.add(i);}}int[] ans = new int[set3.size()];int index = 0;for(int i:set3){ans[index++] = i;}return ans;}
}

2. 350【两个数组的交集 II】

  • 题目: 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
  • 代码:
class Solution {public int[] intersect(int[] nums1, int[] nums2) {//与上一题相比,本题结果是可重复的、无序的,考虑使用HashMap存储//key为交集中的元素,value为key出现的次数int[] ans = new int[nums1.length];int index = 0;HashMap<Integer,Integer> map = new HashMap<>();for (int i = 0; i < nums1.length; i++) {map.put(nums1[i],map.getOrDefault(nums1[i],0)+1);}for (int i = 0; i < nums2.length; i++) {if(map.containsKey(nums2[i]) && map.get(nums2[i])>0){ans[index++] = nums2[i];map.put(nums2[i], map.get(nums2[i])-1);}}return Arrays.copyOfRange(ans,0,index);}
}

三、快乐数

1. 202【快乐数】

  • 题目: 编写一个算法来判断一个数 n 是不是快乐数。
    「快乐数」 定义为:
    • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
    • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
    • 如果这个过程 结果为 1,那么这个数就是快乐数。
    • 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
  • 代码:
class Solution {public boolean isHappy(int n) {//无限循环,也就是说,平方和会重复出现,考虑使用HashSetHashSet<Integer> set = new HashSet<>();while (true){int sum = 0;while (n>0){sum += (n % 10) * (n % 10);n /= 10;}if(sum == 1){return true;}if(set.contains(sum)){return false;}set.add(sum);n = sum;}}
}

四、数相加

1. 1【两数之和】

  • 题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
  • 代码:
class Solution {public int[] twoSum(int[] nums, int target) {//本题需要返回数组下标,返回的元素不可重复,因此考虑使用HashMap存储//key存储元素,value存储元素对应下标//注意,nums数组可重复,可能有两个相同的数相加等于targetHashMap<Integer,Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {if(map.containsKey(target-nums[i])){return new int[]{map.get(target-nums[i]),i};}map.put(nums[i],i);}return new int[2];}
}

2. 454【四数相加II】

  • 题目: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
    • 0 <= i, j, k, l < n
    • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
  • 代码:
class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {//因为题目只要求返回相加等于0的个数,因此可以只记录和数,与该和数出现的次数即可//以和数为key,出现次数为valueint ans = 0;HashMap<Integer,Integer> map = new HashMap<>();for (int i = 0; i < nums1.length; i++) {for (int j = 0; j < nums2.length; j++) {int key = nums1[i]+nums2[j];map.put(key,map.getOrDefault(key,0)+1);}}for (int i = 0; i < nums3.length; i++) {for (int j = 0; j < nums4.length; j++) {int key = 0 - nums3[i] - nums4[j];if(map.containsKey(key)){ans += map.get(key);}}}return ans;}
}

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

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

相关文章

自定义ORM(mybatis)源码(六)-类型处理器

自定义ORM(mybatis)源码(六)-类型处理器 模仿mybatis 用于处理 sql 设置参数类型和 执行 sql 后响应字段的类型处理 TypeHandler public interface TypeHandler<T> {/*** sql 设置参数值* param pstmt* param i* param value* throws SQLException*/void setParamete…

Vue表格中鼠标移入移出input显示隐藏 ,有输入值不再隐藏

Vue表格中鼠标移入移出input显示隐藏 , 不再隐藏的效果 <el-tableref"table":data"tableDatas"borderstyle"width: 100%":span-method"arraySpanMethod"id"table"row-key"id"cell-mouse-enter"editCell&q…

如何把透明OLED显示屏介绍给用户人群

透明OLED显示屏是一种新型的显示技术&#xff0c;它具有透明度高、色彩鲜艳、对比度高、响应速度快等优点。下面是一些介绍透明OLED显示屏的要点&#xff1a; 透明度&#xff1a;透明OLED显示屏的最大特点是其透明度&#xff0c;它可以让光线透过显示屏&#xff0c;使得屏幕背后…

案例101:基于微信小程序的停车共享小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

node实现简单的数据爬虫

前言 我使用的是墨迹天气的页面&#xff0c;因为这个使用的链接简单 页面结构简单并且大都是文字形式 第一步 打开墨迹天气网址 随便点开一个页面 点击F12或者鼠标右键点击检查 查看页面的信息 分析页面内容 使用文字所在的class和标签来定位 编写代码 配置express环境 …

景区气象站:旅游体验的新升级

随着科技的发展和人们生活水平的提高&#xff0c;越来越多的人选择在节假日或周末外出旅游&#xff0c;感受大自然的美好。然而&#xff0c;在享受大自然的同时&#xff0c;天气因素成为了影响旅游体验的关键因素之一。为了更好地服务游客&#xff0c;许多景区开始引入气象站&a…

多层负载均衡实现

1、单节点负载均衡 1&#xff09;站点层与浏览器层之间加入了一个反向代理层&#xff0c;利用高性能的nginx来做反向代理 2&#xff09;nginx将http请求分发给后端多个web-server 优点&#xff1a; 1&#xff09;DNS-server不需要动 2&#xff09;负载均衡&#xff1a;通过ngi…

常用adb命令总结

1.查看设备cpu架构 adb shell getprop ro.product.cpu.abi 2.查看当前屏幕显示的Activity adb shell dumpsys activity activities3.查看apk包详细信息 aapt dump badging ***.apk

Python 中的字符串基础与应用

在Python中&#xff0c;字符串可以用单引号或双引号括起来。‘hello’ 与 “hello” 是相同的。您可以使用print()函数显示字符串文字&#xff1a; 示例&#xff1a; print("Hello") print(Hello)将字符串分配给变量是通过变量名后跟等号和字符串完成的&#xff1a;…

机器视觉算法思路

缺陷检测的一般方法&#xff1a; 1、blob特征 2、blob特征差分 3、频域 4、光度立体 5、测量拟合

【每日一题】得到山形数组的最少删除次数

文章目录 Tag题目来源解题思路方法一&#xff1a;最长递增子序列 写在最后 Tag 【最长递增子序列】【数组】【2023-12-22】 题目来源 1671. 得到山形数组的最少删除次数 解题思路 方法一&#xff1a;最长递增子序列 前后缀分解 根据前后缀思想&#xff0c;以 nums[i] 为山…

2312llvm,04后端上

后端 后端由一套分析和转换趟组成,任务是生成代码,即把LLVM中间(IR)转换为目标代码(或汇编). LLVM支持广泛目标:ARM,AArch64,Hexagon,MSP430,MIPS,NvidiaPTX,PowerPC,R600,SPARC,SystemZ,X86,和XCore. 所有这些后端共享一套,按通用API方法抽象后端任务的目标无关生成代码的一部…

React尝鲜

组件 React的组件就是一个js函数&#xff0c;函数内部return一个由jsx语法创建的html代码片段。 //MyComp.js export default function MyComp(){return (<h1>我是新组件MyComp</h1>) } 在需要引入组件的地方import导入组件&#xff0c;并放在相应位置 //App.js…

用C#也能做机器学习?

前言✨ 说到机器学习&#xff0c;大家可能都不陌生&#xff0c;但是用C#来做机器学习&#xff0c;可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的&#xff0c;这种方式比较适合.NET程序员在项目中集成机器学习模型&#xff0c;不太适合专门学习机器学习&a…

大规模采用奇点临近?Web3应用爆发离不开这个“支撑”赛道

作者&#xff5c;Jason Jiang 数据是当今世界最具价值的资源&#xff0c;也是数字掘金的必争之地。尽管Web3迄今仍有诸多争议&#xff0c;但随着铭文、Gamefi、DeFi等链上生态的多样化发展&#xff0c;我们正身处Web3应用爆发的洪流之中&#xff0c;区块链数据赛道也因此备受关…

vue关闭当前路由页面并跳转到其父页面

1.dom中添加关闭或取消按钮 <el-button type"primary" class"blueLinearbg cancelBtn" click"cancel" >取 消</el-button>2.cancel方法中 /*取消或关闭*/cancel(){this.$store.dispatch("tagsView/delView", this.$route)…

电梯机房【摊鸡蛋】

小伍&#xff1a;大家好&#xff0c;今天小伍给大家表演个机房【摊鸡蛋】&#xff1b; &#xff08; 哈哈哈 &#x1f602;&#x1f602;&#x1f602; &#xff09; 523能源&#xff1a;别闹了&#xff0c;机房里连个锅都没有&#xff0c;怎么摊鸡蛋啊&#xff1f; 小伍&am…

leetcode做题笔记2866. 美丽塔 II

给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < heights[i] < maxHeights[i]heights 是一个 …

论文阅读:Long-Term Visual Simultaneous Localization and Mapping

论文摘要指出&#xff0c;为了在长期变化的环境中准确进行定位&#xff0c;提出了一种新型的长期视觉SLAM&#xff08;同步定位与地图构建&#xff09;系统&#xff0c;该系统具备地图预测和动态物体移除功能。系统首先设计了一个高效的视觉点云匹配算法&#xff0c;将2D像素信…

基础数论1

文章目录 质数质因数分解 约数 g c d gcd gcd求最大公约数 质数 质因数分解 算术基本定理&#xff1a; 任何一个大于 1 的正整数都能唯一分解为有限个质数的乘积&#xff0c;可以写作&#xff1a; 任何一个大于1的正整数都能唯一分解为有限个质数的乘积&#xff0c;可以写作…