【哈希表】算法例题

  

目录

  五、哈希表

39. 赎金信 ①

40. 同构字符串 ①

41. 单词规律 ①

42. 有效的字母异位词 ①

43. 字母异位词分组 ②

44. 两数之和 ①

45. 快乐数 ①

46. 存在重复元素 ①

47. 最长连续序列 ②


五、哈希表

39. 赎金信 ①

 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = "a", magazine = "b"
输出:false

示例 2:

输入:ransomNote = "aa", magazine = "ab"
输出:false

示例 3:

输入:ransomNote = "aa", magazine = "aab"
输出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNote 和 magazine 由小写英文字母组成

方法1:(11ms)

    public static boolean canConstruct(String ransomNote, String magazine) {if (ransomNote.length() > magazine.length()){return false;}HashMap<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++) {if (map.containsKey(ransomNote.charAt(i))){Integer integer = map.get(ransomNote.charAt(i));if (map.get(ransomNote.charAt(i)) == null || integer < 1){return false;}else {map.put(ransomNote.charAt(i), integer - 1);}}else {return false;}}return true;}

方法2:

        if (magazine.length() < ransomNote.length())return false;int[] res = new int[26];for (char c : ransomNote.toCharArray()) {int index = magazine.indexOf(c, res[c - 'a']);if (index == -1)return false;res[c - 'a'] = index + 1;}return true;

方法3:

    public boolean canConstruct(String ransomNote, String magazine) {if(ransomNote.length()>magazine.length()){return false;}int []record = new int[26];for(int i=0;i<magazine.length();i++){record[magazine.charAt(i)-'a']++;}for(int i=0;i<ransomNote.length();i++){record[ransomNote.charAt(i)-'a']--;}for(int i =0;i<record.length;i++){if(record[i]<0){return false;}}return true;}

40. 同构字符串 ①

 给定两个字符串 s 和 t ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add"输出:true

示例 2:

输入:s = "foo", t = "bar"输出:false

示例 3:

输入:s = "paper", t = "title"输出:true

提示:

  • 1 <= s.length <= 5 * 104
  • t.length == s.length
  • s 和 t 由任意有效的 ASCII 字符组成

方法1:(81ms)

    public static boolean isIsomorphic(String s, String t) {int[] record = new int[2];HashMap<Character, String> map1 = new HashMap<>();HashMap<Character, String> map2 = new HashMap<>();for (int i = 0; i < s.length(); i++) {String orDefault = map1.getOrDefault(s.charAt(i), "");orDefault += i;map1.put(s.charAt(i), orDefault);String orDefault1 = map2.getOrDefault(t.charAt(i), "");orDefault1 += i;map2.put(t.charAt(i), orDefault1);if (!orDefault.equals(orDefault1)){return false;}}return true;}

方法2:(1ms)

    public boolean isIsomorphic(String s, String t) {char[] ss = s.toCharArray();char[] ts = t.toCharArray();int[] trans1 = new int[128];int[] trans2 = new int[128];for(int i=0,n = ss.length;i<n;i++){char sc = ss[i];char tc = ts[i];if(trans1[sc]!=trans2[tc]){return false;}else if(trans1[sc]==0){trans1[sc]=trans2[tc]=i+1;}}return true;}

41. 单词规律 ①

 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", s = "dog cat cat dog"输出: true

示例 2:

输入:pattern = "abba", s = "dog cat cat fish"输出: false

示例 3:

输入: pattern = "aaaa", s = "dog cat cat dog"输出: false

提示:

  • 1 <= pattern.length <= 300
  • pattern 只包含小写英文字母
  • 1 <= s.length <= 3000
  • s 只包含小写英文字母和 ' '
  • s 不包含 任何前导或尾随对空格
  • s 中每个单词都被 单个空格 分隔

方法1:(1ms)

    public static boolean wordPattern(String pattern, String s) {String[] s1 = s.split(" ");if (pattern.length() != s1.length){return false;}HashMap<Character, String> map = new HashMap<>();for (int i = 0; i < pattern.length(); i++) {char c = pattern.charAt(i);String value = map.get(c);if (value == null){  // || !(c + value).equals(c + s1[i])map.put(c, s1[i]);}else {if (!value.equals(s1[i])){return false;}}}ArrayList<String> list = new ArrayList<>();for (Map.Entry<Character, String> entry : map.entrySet()) {if (list.contains(entry.getValue())){return false;}list.add(entry.getValue());}return true;}

方法2:

    public boolean wordPattern(String pattern, String s) {String[] data =s.split(" ");if(data.length!=pattern.length()){return false;}String[] p2w = new String[26];Map<String, Character> w2p = new HashMap<>();for (int i = 0; i < pattern.length(); i++) {char c = pattern.charAt(i);if (p2w[c - 'a'] == null) {p2w[c - 'a'] = data[i];} else if (!p2w[c - 'a'].equals(data[i])) {return false;}if (w2p.get(data[i]) == null) {w2p.put(data[i], c);} else if (w2p.get(data[i]).charValue() != c) {return false;}}return true;}

42. 有效的字母异位词 ①

 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

方法1:(3ms)

    public boolean isAnagram(String s, String t) {if (s.length() != t.length()){return false;}int[] chars = new int[26];for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);chars[c - 'a']++;}for (int i = 0; i < t.length(); i++) {char c = t.charAt(i);chars[c - 'a']--;}for (int i = 0; i < 26; i++) {if (chars[i] != 0){return false;}}return true;}

43. 字母异位词分组 ②

 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]输出: [[""]]

示例 3:

输入: strs = ["a"]输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

方法1:(9ms)

    public static List<List<String>> groupAnagrams(String[] strs) {ArrayList<List<String>> result = new ArrayList<>();HashMap<String, List<String>> map = new HashMap<>();for (int i = 0; i < strs.length; i++) {char[] chars = strs[i].toCharArray();Arrays.sort(chars);String key = Arrays.toString(chars);List<String> value = map.get(key);if (value == null){value = new ArrayList<>();}value.add(strs[i]);map.put(key, value);}// List<List<String>> collect = new ArrayList<>(map.values());for (Map.Entry<String, List<String>> entry : map.entrySet()) {result.add(entry.getValue());}return result;}

44. 两数之和 ①

 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

方法1:(41ms)

    public static int[] twoSum(int[] nums, int target) {int[] result = new int[2];int left = 0;int right = +1;for (int i = 0; i < nums.length; i++) {left = i;right = left +1;while (right < nums.length){if (nums[left] + nums[right] == target){result[0] = left;result[1] = right;break;}right++;}left++;}return result;}

方法2:(0ms)

    public static int[] twoSum(int[] nums, int target) {if (nums.length == 2) {return new int[]{0, 1};}for (int i = 0, j = 1; j < nums.length; ++i) {if (i + j >= nums.length) {i = -1;j++;} else if (nums[i] + nums[i + j] == target) {return new int[]{i, j + i};}}return new int[]{};}

45. 快乐数 ①

 编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

方法1:(3ms)

    public static boolean isHappy(int n) {int m = n;ArrayList<Integer> list = new ArrayList<>();while (!list.contains(m)){list.add(m);if (m == 1){return true;}int sum = 0;String str = m + "";int length = str.length();for (int i = 0; i < length; i++) {sum += Math.pow(Integer.parseInt(str.charAt(i) + "") , 2);}m = sum;}return false;}

方法2:(0ms)

    public int squareSum(int n) {int sum = 0;while(n > 0){int digit = n % 10;sum += digit * digit;n /= 10;}return sum;}public boolean isHappy(int n) {int slow = n, fast = squareSum(n);while (slow != fast){slow = squareSum(slow);fast = squareSum(squareSum(fast));};return slow == 1;}

方法2:(1ms)

    public boolean isHappy(int n) {Set<Integer> set = new HashSet<>();while(n!=1  &&  !set.contains(n)){set.add(n);n=cal(n);}return n==1;}public int cal(int nn){int sum=0;while(nn!=0){sum+=(nn%10)*(nn%10);nn/=10;}return sum;}

46. 存在重复元素 ①

 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [1,2,3,1], k = 3
输出:true

示例 2:

输入:nums = [1,0,1,1], k = 1
输出:true

示例 3:

输入:nums = [1,2,3,1,2,3], k = 2
输出:false

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • 0 <= k <= 105

方法1:

        if (nums.length == 1){return false;}boolean flag = false;int exist = 0;for (int i = 0; i < nums.length - 1; i++) {for (int j = i + 1; j <= Math.min(i + k, nums.length-1); j++) {if (nums[i]  == nums[j]){flag = true;exist = 1;break;}}if (exist == 1){break;}}return flag;}

方法2:

    public boolean containsNearbyDuplicate(int[] nums, int k) {Set<Integer> set= new HashSet<>();for(int i = 0;i<nums.length;i++){if(i>k){set.remove(nums[i-k-1]);}if(!set.add(nums[i])){return true;}}return false;}

47. 最长连续序列 ②

 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109

方法1:

    public static int longestConsecutive(int[] nums) {if (nums.length == 0){return 0;}else if (nums.length == 1){return 1;}Arrays.sort(nums);System.out.println(Arrays.toString(nums));TreeSet<Integer> set = new TreeSet<>();int index = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1] +1){index++;if (i == nums.length - 1){set.add(index);}}else if (nums[i] == nums[i - 1]){set.add(index);continue;}else {set.add(index);index = 1;}}System.out.println(set);return set.last();}

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

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

相关文章

Linux入门-常见指令及权限理解

目录 1、Linux背景 1.1、发展历史 1.2、开源 1.3Linux企业应用现状 2、Linux下的基本命令 2.1、ls 指令 2.2、pwd 命令 2.3、cd 命令 2.4、touch命令 2.5、mkdir 命令 2.6、rmdir 指令和 rm指令 2.7 man 指令 2.8、cp指令 2.9、mv 指令 2.10 cat 2.11 more 2…

网络学习:IPV6基础配置

目录 一、配置接口的全球单播地址 二、配置接口本地链路地址 三、配置接口任播地址 四、配置接口PMTU 配置静态PMTU&#xff1a; 配置动态PMTU&#xff1a; 五、接口配置IPV6地址示例&#xff1a; 一、配置接口的全球单播地址 全球单播地址类似于IPv4公网地址&#xff0…

个人微信开发API

安卓微信的api&#xff0c;个人微信开发API协议&#xff0c;微信 ipad &#xff0c;微信ipad协议&#xff0c;微信web版接口api&#xff0c;微信网页版接口&#xff0c;微信开发sdk&#xff0c;微信开发API&#xff0c;微信协议&#xff0c;微信接口文档&#xff0c;网页个人微…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS…

docker小白第十四天之Portainer与CIG

Portainer简介 Portainer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 Portainer命令安装 # 一个容器可以同时起多个-p端口&#xff0c;restartalways表示随时在线&#xff0c;重启机器后也…

麒麟系统Redis7.2哨兵集群部署

redis哨兵集群部署 1、原理 Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。 Redis 提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵进程会周期性地向主…

Flutter开发入门——路由

什么是路由&#xff1f; 移动端应用开发中&#xff0c;路由技术是一个非常重要的组成部分。路由技术负责管理应用中各个页面之间的跳转、导航以及参数传递等关键功能。在移动端应用中&#xff0c;一个高效、易于维护的路由系统对于提高开发效率和用户体验具有重要意义。 Flut…

MySQL 多表查询与事务的操作

一,多表联查 有些数据我们已经拆分成多个表,他们之间通过外键进行连接.当我们要查询两个表的数据,各取其中的一列或者多列. 这时候就需要使用多表联查. 数据准备: # 创建部门表 create table dept(id int primary key auto_increment,name varchar(20) ) insert into dept (n…

【机器学习系列】M3DM工业缺陷检测部署与训练

一.基础资料 1.Git 地址 地址 2.issues issues 3.参考 参考 csdn 二.服务器信息 1.GPU 服务器 GPU 服务器自带 CUDA 安装(前提是需要勾选上)CUDA 需要选择大于 11.3 的版本登录服务器后会自动安装 GPU 驱动 2.CUDA 安装 GPU 服务器自带 CUDA CUDA 版本查看 3.登录信…

软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

软件企业在咨询第三方软件测试机构报价时,应提前准备什么资料?

近年来&#xff0c;随着软件行业的迅速发展&#xff0c;软件企业对于软件质量的重视程度日益增加。为了确保软件产品的质量以及用户的满意度&#xff0c;越来越多的企业倾向于委托第三方软件测试机构进行测试工作。在咨询第三方软件测试机构报价之前&#xff0c;软件企业需要提…

软考81-上午题-【面向对象技术3-设计模式】-行为型设计模式01

一、行为型设计模式一览 二、责任链模式 2-1、意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 1-2、结构 1-3、代码实现 1-4、适…

C/C++炸弹人游戏

参考书籍《啊哈&#xff0c;算法》&#xff0c;很有意思的一本算法书&#xff0c;小白也可以看懂&#xff0c;详细见书&#xff0c;这里只提供代码和运行结果。 这里用到的是枚举思想&#xff0c;还有更好地搜索做法。 如果大家有看不懂的地方或提出建议&#xff0c;欢迎评论区…

【Linux】Linux基本开发工具(yum) (vi/vim)的使用

本文章内容&#xff1a; 学习yum工具&#xff0c;进行软件安装掌握vim编辑器使用 Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成…

基于python的4s店客户管理系统

技术&#xff1a;pythonmysqlvue 一、背景 进入21世纪网络和计算机得到了飞速发展&#xff0c;并和生活进行了紧密的结合。目前&#xff0c;网络的运行速度以达到了千兆&#xff0c;覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务…

2024.03.19日志

今日复盘 1 学习导师给的项目 1.1 了解项目的业务背景&#xff1a;经销商-银行贷款 1.2 了解了大致的业务流程 经销商添加客户贷款信息->提交贷款信息->银行审核->审核通过经销商提交客户贷款信息资料->银行审核->制作名单导入网贷系统 1.3 业务功能 经销…

Java 设计模式系列:行为型-状态模式

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;允许一个对象在其内部状态改变时改变其行为。状态模式中类的行为是由状态决定的&#xff0c;在不同的状态下有不同的行为。 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂…

linux下关闭swap文件系统

临时关闭&#xff08;马上生效&#xff09; 永久关闭&#xff08;重启计算机才能生效&#xff09; vim /etc/fstab

深入浅出Hive性能优化策略

我们将从基础的HiveQL优化讲起&#xff0c;涵盖数据存储格式选择、数据模型设计、查询执行计划优化等多个方面。会的直接滑到最后看代码和语法。 目录 引言 Hive架构概览 示例1&#xff1a;创建表并加载数据 示例2&#xff1a;优化查询 Hive查询优化 1. 选择适当的文件格…

基于springboot+vue的交通管理在线服务系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…