哈希表篇

news/2024/11/28 18:34:41/文章来源:https://www.cnblogs.com/tcl-study/p/18574942

哈希表

有效的字母异位词

image-20241116112337412

/*** 242. 有效的字母异位词 字典解法* 时间复杂度O(m+n) 空间复杂度O(1)*/
class Solution {public boolean isAnagram(String s, String t) {int[] record = new int[26];for (int i = 0; i < s.length(); i++) {record[s.charAt(i) - 'a']++;     // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了}for (int i = 0; i < t.length(); i++) {record[t.charAt(i) - 'a']--;}for (int count: record) {if (count != 0) {               // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。return false;}}return true;                        // record数组所有元素都为零0,说明字符串s和t是字母异位词}
}

注解:

这道题我在一开始做的时候没想到这种方法,当时想的可能是把字符按照从a到z排好,然后看最后两个字符串一样不一样。

两个数组的交集

image-20241116225637052

import java.util.HashSet;
import java.util.Set;class Solution {public int[] intersection(int[] nums1, int[] nums2) {if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {return new int[0];}Set<Integer> set1 = new HashSet<>();Set<Integer> resSet = new HashSet<>();//遍历数组1for (int i : nums1) {set1.add(i);}//遍历数组2的过程中判断哈希表中是否存在该元素for (int i : nums2) {if (set1.contains(i)) {resSet.add(i);}}//方法1:将结果集合转为数组###mapToInt 是流的一个中间操作,它的作用是将流中的每个元素按照指定的函数进行映射转换,这里的函数是一个 Lambda 表达式 x -> x。对于 mapToInt 流,toArray() 方法最终会生成一个整数类型的数组,其元素就是原来集合 resSet 中经过转换后的整数元素。return resSet.stream().mapToInt(x -> x).toArray();//方法2:另外申请一个数组存放setRes中的元素,最后返回数组int[] arr = new int[resSet.size()];int j = 0;for(int i : resSet){arr[j++] = i;}return arr;}
}
我用的方法import java.util.ArrayList;
class Solution {public int[] intersection(int[] nums1, int[] nums2) {int[] cur1 = new int[1001];int[] cur2 = new int[1001];List<Integer> comp = new ArrayList<>();for (int i : nums1) {cur1[i] = 1;}for (int i : nums2) {cur2[i] = 1;}for (int i=0; i<=1000; i++) {if (cur1[i]==1 && cur2[i]==1) {comp.add(i);}}#############下面这个地方不是我想的,我自己这个地方没有解决#########  int index = 0;int res[] = new int[comp.size()];for (int i : comp) {res[index++] = i;}return res;}
}

快乐数

image-20241120160902253

看的答案解析class Solution {public boolean isHappy(int n) {Set<Integer> record = new HashSet<>();while (n != 1 && !record.contains(n)) {record.add(n);n = getNextNumber(n);}return n == 1;}private int getNextNumber(int n) {int res = 0;while (n > 0) {int temp = n % 10;res += temp * temp;n = n / 10;}return res;}
}

两数之和

image-20241120161056418

哈希表1,这个里面通过一遍循环,完成查找工作。class Solution {public int[] twoSum(int[] nums, int target) {int len = nums.length;int[] res = new int[2];if (nums == null || len == 0) {return res;}Map<Integer, Integer> map = new HashMap<>();for (int i=0; i<len; i++) {int temp = target - nums[i];if (map.containsKey(temp)) {res[1] = i;res[0] = map.get(temp);break;}map.put(nums[i], i);}return res;}
}
使用哈希表方法2class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> indexMap = new HashMap<>();for (int i=0; i<nums.length; i++) {int balance = target - nums[i];if (indexMap.containsKey(balance)) {return new int []{i, indexMap.get(balance)};} else {indexMap.put(nums[i], i);}}}
}
我自己写的class Solution {public int[] twoSum(int[] nums, int target) {int len = nums.length;int[] cur = new int[2];for (int i=0; i<len-1; i++) {for (int j=i+1; j<len; j++) {if (nums[i]+nums[j] == target) {cur[0] = i;cur[1] = j;}}}return cur;}
}

陌生-四数相加||

image-20241121151210269

官方代码class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res = 0;Map<Integer, Integer> map = new HashMap<Integer, Integer>();//统计两个数组中的元素之和,同时统计出现的次数,放入mapfor (int i : nums1) {for (int j : nums2) {int sum = i + j;map.put(sum, map.getOrDefault(sum, 0) + 1);}}//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数for (int i : nums3) {for (int j : nums4) {res += map.getOrDefault(0-i-j, 0);}}return res;}
}

了解-赎金信

image-20241121152859169

官方代码class Solution {public boolean canConstruct(String ransomNote, String magazine) {if (ransomNote.length() > magazine.length()) return false;int[] record = new int[26];// toCharArray 主要作用是将一个String对象转换为一个字符数组for (char c : magazine.toCharArray()) {record[c - 'a'] += 1;}for (char c : ransomNote.toCharArray()) {record[c - 'a'] -= 1;}// 如果数组中存在负数,说明ransomNote字符串中存在magazine中没有的字符for (int i : record) {if (i < 0) {return false;}}return true;}
}

image-20241121152925434

陌生-多看-三数之和

image-20241121163934946

双指针法class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i=0; i<nums.length; i++) {// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) {return result;}if (i>0 && nums[i]==nums[i-1]) {continue;}int left = i + 1;int right =nums.length - 1;while (right > left) {int sum = nums[i] + nums[left] + nums[right];if (sum > 0) {right--;} else if (sum < 0) {left++;} else {result.add(Arrays.asList(nums[i], nums[left], nums[right]));// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;right--;left++;}}}return result;}
}

这个题解题思想要了解清楚。

// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;

这个地方需要理清楚。

四数之和

image-20241121164241242

随想录给的代码:public class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {Arrays.sort(nums);  // 排序数组List<List<Integer>> result = new ArrayList<>();  // 结果集for (int k = 0; k < nums.length; k++) {// 剪枝处理if (nums[k] > target && nums[k] >= 0) {break;}// 对nums[k]去重if (k > 0 && nums[k] == nums[k - 1]) {continue;}for (int i = k + 1; i < nums.length; i++) {// 第二级剪枝if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {break;}// 对nums[i]去重if (i > k + 1 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while (right > left) {long sum = (long) nums[k] + nums[i] + nums[left] + nums[right];if (sum > target) {right--;} else if (sum < target) {left++;} else {result.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right]));// 对nums[left]和nums[right]去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;right--;left++;}}}}return result;}

相当于在三数之和的基础上再套一层代码。

总结

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

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

相关文章

windows下编程中的多用户、权限问题

编程中经常遇到windows相关的多用户问题,以下通过代码进行实际验证。 一、创建一个UserTest程序using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Security.Principal; using System.Text; using System.Threadin…

电力IEC103/2/1/4规约数据采集仪器网关通讯管理机测试软件工具客户端服务器 LFP/NZ94/N4F规约

www.daq-iot.com作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流。IEC103规约支持:工具完全适用于电力行业的各种通信测试采集需求。 串口和以太网通信:工具支持通过串口和以太网进行通信,灵活适应不同的电力通…

创新的在线音乐播放器-支持特别歌曲

音乐播放器开发学习笔记 项目简介 这是一个基于Web的音乐播放器练习项目,主要用于学习和实践Web开发技术。项目采用PHP开发,实现了基础的音乐播放功能。 在线体验实现功能 本项目目前包含以下基础功能:音乐搜索和播放 音频文件下载 歌词同步显示 音量调节控制 播放控制(暂停…

触觉智能亮相OpenHarmony人才生态大会2024

11月27日,OpenHarmony人才生态大会2024在武汉隆重举行。本次大会汇聚了政府领导、学术大咖、操作系统技术专家、高校及企业代表,围绕新时代背景下的操作系统人才培养进行了深入探讨,分享高校、企业在产学研融合方面的先进经验,全面展现了OpenHarmony在人才生态领域学-考-用…

20222415 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 本周学习了Web安全。 2.实验过程 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式 Registrar: MarkMonitor Inc. Registrar Abuse Contact Email: abusecomplaints@markmonitor.com Registrar Abus…

活动回顾丨云原生开源开发者沙龙杭州站回放 PPT 下载

11 月 08 日,云原生开源开发者沙龙丨AI 应用工程化专场在杭州顺利举办。现场座无虚席,阿里云一线工程师围绕《构建面向 AI 应用可观测能力》、《Java 开发者如何玩转 AI》、《事件驱动构建 AI 原生应用》、《智启未来:通过 AI 网关快速构建智能应用》4 个当下热门议题深入分…

Vulnhub WestWild1.1

0x01:端口扫描 主机发现 nmap -sn 192.168.231.0/24全端口扫描 nmap --min-rate 10000 -p- 192.168.231.140开了22ssh,80http,两个smb服务 详细端口扫描 nmap -sT -sC -sV -O --min-rate 10000 -p22,80,139,445 192.168.231.140漏洞扫描 nmap --script=vuln -p22,80,139,445…

【VMware VCF】基于 RDU 方式更新 VCF 环境中的 vCenter Server 组件。

Reduced Downtime Upgrade(RDU)是一种基于“迁移”的 vCenter Server 更新方式,通过临时部署一个与源 vCenter Server 完全一致的目标 vCenter Server(类似于跨版本 vCenter Server 升级),然后找一个维护窗口期完成源 vCenter Server 和目标 vCenter Server 的切换即可,…

『模拟赛』多校A层冲刺NOIP2024模拟赛27终结篇

『模拟赛记录』多校A层冲刺NOIP2024模拟赛27终结篇Rank rp++A. 【模板】分治FFT 签。没取模挂 50pts。 列出式子发现无论何种合并方式,最终权值均为 \(\sum_{i=1}^n\ a_i\times (\sum_{j=i}^n\ a_i)\),因此求方案数即可。发现每一步相当于从当前堆数中任选两个出来,容易得出…

服装行业如何应对快速生产与库存管理挑战?

在服装行业,快时尚的浪潮让市场变化迅速,消费者的需求也在不断变化。而与此同时,企业面对的压力也越来越大——生产周期紧、库存管理难、设计和销售协调困难,往往导致一系列管理瓶颈。如何在如此竞争激烈的环境中提高生产效率、快速响应市场需求,同时确保库存不积压?这些…

智能佳科技—3台Aloha机械臂同发交付, 协同作战新纪元!

视频链接:https://mp.weixin.qq.com/s/JA3iaVqerm4owFYAkrYy8g近日,北京智能佳科技有限公司顺利完成三台Mobile Aloha机械臂的共同发货交付使用任务,再次展现了公司在机器人技术领域的深厚积累和卓越实力。 自2006年8月成立以来,智能佳科技始终秉持着务实创新的精神,连续四…