代码随想录-算法训练营day06【有效的字母异位词、两个数组的交集、快乐数、两数之和】

  1. 专栏笔记:https://blog.csdn.net/weixin_44949135/category_10335122.html
第三章 哈希表part01今日任务 ● 哈希表理论基础 
● 242.有效的字母异位词 
● 349. 两个数组的交集 
● 202. 快乐数
● 1. 两数之和   详细布置 哈希表理论基础 建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。  什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。  这句话很重要,大家在做哈希表题目都要思考这句话。 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html  242.有效的字母异位词 建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。 题目链接/文章讲解/视频讲解: https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html  349. 两个数组的交集 建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。 题目链接/文章讲解/视频讲解:https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html  202. 快乐数 建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子 题目链接/文章讲解:https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html  1. 两数之和 建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。 建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。 题目链接/文章讲解/视频讲解:https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html

目录

0242_有效的字母异位词

0349_两个数组的交集

0202_快乐数

0001_两数之和


0242_有效的字母异位词

int[] record = new int[26];
for (int i = 0; i < s.length(); i++) {
        record[s.charAt(i) - 'a']++; //并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}

import java.util.Arrays;class Solution0242 {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) {return false;}char ss[] = s.toCharArray();Arrays.sort(ss);char tt[] = s.toCharArray();Arrays.sort(tt);for (int i = 0; i < ss.length; i++) {if (ss[i] != tt[i]) {return false;}}return true;}/*** 242. 有效的字母异位词 字典解法* 时间复杂度O(m+n) 空间复杂度O(1)*/public boolean isAnagram2(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是字母异位词}
}

0349_两个数组的交集

  • 取并集(Union):将两个集合中的所有元素合并在一起,去除重复项。
    • Set<Integer> unionSet = new HashSet<>(set1);
    • unionSet.addAll(set2);
  • 取差集(Difference):从第一个集合中移除与第二个集合相同的元素。
    • Set<Integer> differenceSet = new HashSet<>(set1);
    • differenceSet.removeAll(set2);
  • 取交集(Intersection):仅保留两个集合中共同存在的元素。
    • Set<Integer> intersectionSet = new HashSet<>(set1);
    • intersectionSet.retainAll(set2);

将结果集合转为数组:

  1. int res[] = set.stream().mapToInt(x -> x).toArray();
  2. int res[] = list.stream().mapToInt(Integer::intValue).toArray();
class Solution0349 {public int[] intersection1(int[] nums1, int[] nums2) {Set<Integer> set1 = new HashSet<>();Set<Integer> set2 = new HashSet<>();for (Integer i : nums1) {set1.add(i);}for (Integer i : nums2) {set2.add(i);}set1.retainAll(set2);int[] res = new int[set1.size()];int index = 0;for (Integer i : set1) {res[index++] = i;}return res;}public int[] intersection2(int[] nums1, int[] nums2) {HashSet<Integer> hashSet1 = new HashSet<>();for (int i = 0; i < nums1.length; i++) {hashSet1.add(nums1[i]);}HashSet<Integer> hashSet2 = new HashSet<>();for (int i = 0; i < nums2.length; i++) {hashSet2.add(nums2[i]);}ArrayList<Integer> list = new ArrayList<>();for (int x : hashSet1) {for (int y : hashSet2) {if (x == y) {list.add(x);}}}int res[] = list.stream().mapToInt(Integer::intValue).toArray();return res;}
}
class Solution0349_2 {//版本一:使用HashSetpublic 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:将结果集合转为数组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;}//版本二:使用Hash数组public int[] intersection2(int[] nums1, int[] nums2) {int[] hash1 = new int[1002];int[] hash2 = new int[1002];for (int i : nums1)hash1[i]++;for (int i : nums2)hash2[i]++;List<Integer> resList = new ArrayList<>();for (int i = 0; i < 1002; i++)if (hash1[i] > 0 && hash2[i] > 0)resList.add(i);int index = 0;int res[] = new int[resList.size()];for (int i : resList)res[index++] = i;return res;}
}

0202_快乐数

while ((n = execute(n)) != 1) {...}

import java.util.HashSet;
import java.util.Set;class Solution0202 {public boolean isHappy(int n) {int index = 0;while (index++ < 1000) {if (execute(n) == 1) {return true;}n = execute(n);}return false;}private int execute(int n) {int sum = 0;while (n != 0) {sum += (n % 10) * (n % 10);n /= 10;}return sum;}
}class Solution0202_2 {public boolean isHappy(int n) {int flag = 0;while (execute(n) != 1) {//n % 10 != n//System.out.println("n:" + n);n = execute(n);flag++;if (flag == 100000) {return false;}}return true;}public int execute(int n) {int len = (n + "").length();int sum = 0;while (len-- >= 0) {sum += (n % 10) * (n % 10);n /= 10;}//System.out.println("sum:" + sum);return sum;}
}class Solution0202_3 {public boolean isHappy(int n) {int flag = 0;while ((n = execute(n)) != 1) {flag++;if (flag == 100000) {return false;}}return true;}public int execute(int n) {int len = (n + "").length();int sum = 0;while (len-- >= 0) {sum += (n % 10) * (n % 10);n /= 10;}return sum;}
}class Solution0202_4 {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;}
}

0001_两数之和

本题其实有四个重点:

  1. 为什么会想到用哈希表
  2. 哈希表为什么用map
  3. 本题map是用来存什么的
  4. map中的key和value用来存什么的

把这四点想清楚了,本题才算是理解透彻了。

System.arraycopy() 是 Java 中用于数组复制的方法。它允许你从一个源数组复制一个指定范围的元素到目标数组的指定位置上。

方法签名如下所示:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

参数解释:

  1. src:源数组。
  2. srcPos:源数组中的起始位置。
  3. dest:目标数组。
  4. destPos:目标数组中的起始位置。
  5. length:要复制的元素数量。

这个方法会将源数组 src 中从 srcPos 开始的 length 个元素复制到目标数组 dest 中,从 destPos 开始的位置开始存放。源数组和目标数组可以是同一个数组,但是复制的范围不可以重叠。

以下是一个示例用法:

int[] sourceArray = {1, 2, 3, 4, 5};
int[] destinationArray = new int[5];// 将源数组 sourceArray 的前三个元素复制到目标数组 destinationArray 中
System.arraycopy(sourceArray, 0, destinationArray, 0, 3);// 输出目标数组的内容
for (int i : destinationArray) {System.out.println(i); // 输出:1, 2, 3, 0, 0
}

这个例子将 sourceArray 中的前三个元素复制到 destinationArray 的起始位置,所以 destinationArray 中的前三个位置变成了 sourceArray 中的元素。

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;class Solution {public int[] twoSum(int[] nums, int target) {int[] index = new int[2];for (int i = 0; i < nums.length; i++) {for (int j = 0; j < nums.length; j++) {if (nums[i] + nums[j] == target && i != j) {index[0] = i;index[1] = j;return index;}}}return index;}public int[] twoSum2(int[] nums, int target) {for (int i = 0; i < nums.length; i++) {for (int j = 0; j < nums.length; j++) {if (nums[i] + nums[j] == target && i != j) {//System.out.println(i + " " + j);return new int[]{i, j};}}}return new int[]{0, 1};}//使用哈希表public int[] twoSum3(int[] nums, int target) {int[] res = new int[2];if (nums == null || nums.length == 0) {return res;}Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int temp = target - nums[i];//遍历当前元素,并在map中寻找是否有匹配的keyif (map.containsKey(temp)) {res[1] = i;res[0] = map.get(temp);break;}map.put(nums[i], i);//如果没找到匹配对,就把访问过的元素和下标加入到map中}return res;}//使用双指针public int[] twoSum4(int[] nums, int target) {int m = 0, n = 0, k, board = 0;int[] res = new int[2];int[] tmp1 = new int[nums.length];//备份原本下标的nums数组System.arraycopy(nums, 0, tmp1, 0, nums.length);//将nums排序Arrays.sort(nums);//双指针for (int i = 0, j = nums.length - 1; i < j; ) {if (nums[i] + nums[j] < target)i++;else if (nums[i] + nums[j] > target)j--;else if (nums[i] + nums[j] == target) {m = i;n = j;break;}}//找到nums[m]在tmp1数组中的下标for (k = 0; k < nums.length; k++) {if (tmp1[k] == nums[m]) {res[0] = k;break;}}//找到nums[n]在tmp1数组中的下标for (int i = 0; i < nums.length; i++) {if (tmp1[i] == nums[n] && i != k)res[1] = i;}return res;}
}

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

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

相关文章

云手机提供私域流量变现方案

当今数字营销领域&#xff0c;私域流量是一座巨大的金矿&#xff0c;然而并非人人能够轻易挖掘。一家营销公司面临着利用社交、社区、自媒体等应用积累私域流量&#xff0c;并通过销售产品、推送广告等方式实现流量变现的挑战与困境。本文将详细介绍这家公司是如何通过云手机&a…

一文了解重塑代币发行方式的创新平台 — ZAP

代币的发行方式对加密市场有着重要的影响&#xff0c;它直接影响着项目的社区建设、流动性、价格稳定性以及投资者的参与度&#xff0c;未来预期等&#xff01;合适的发行方式可以吸引更多的投资者和用户参与&#xff0c;提升项目的社区建设和价值实现。不当的发行方式和分配&a…

经典算法-分治法由散点得出凸包-python实现

import copy import random import matplotlib import mathdef distance_p2l(point, line_point1, line_point2):if (line_point2[0] - line_point1[0]) 0:return abs(point[0] - line_point2[0])# 计算直线的斜率m (line_point2[1] - line_point1[1]) / (line_point2[0] - l…

MySQL的内连接和外连接

内连接 在之前的MySQL的复合查询时&#xff0c;我们能够通过给两个表做笛卡尔积查询和where子句限定条件来查询想查询的数据&#xff0c;不过MySQL还提供了内连接用来给两个表做笛卡尔积&#xff0c;对比之前的复合查询笛卡尔积来说语法更加简洁。 语法&#xff1a;select 字段…

实验:基于Red Hat Enterprise Linux系统建立逻辑卷并进行划分

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 1. 为虚拟机添加三块大小为5GB的磁盘nvme0n2 nvme0n3 nvme0n4 2. 将三块硬盘转换为物理卷&#xff0c;并将nvme0n2 nvme0n3两pv建立成名为"自己名字_vg“的卷组&#xff0c;并将nvme0n4扩展进该卷组。 LVM管…

MySQL数据库的增删改查(进阶)

1.新增 将一个表中的内容插入到另一个表中. 这里需要确保查询集合的列数,类型,顺序要和插入表的列数,类型,顺序一致,这里列的名称可以不一样. values 替换成了select 查询的临时表. 2. 查询 2.1 聚合查询 2.1.1 聚合查询 函数 说明COUNT([DISTINCT] expr)返回…

k8snode节点kubeadm join主节点失败,请问你们有什么好的办法吗?

K8S版本&#xff1a;1.20.9&#xff0c;docker也是1.20的 在网上找了&#xff0c;说是关闭交换区swap&#xff0c;这个也关了&#xff0c;防火墙也关了&#xff0c;现在kubelet无法启动&#xff0c;网上查了只有kubeadm init后kubelet才能启动&#xff0c;而init后10250端口会…

Master节点快照回退遇到的容器不存在的问题

这次遇到的问题说起来有点扯&#xff0c;k8s集群出了点问题&#xff0c;kuboard无法访问&#xff0c;查看容器状态后&#xff0c;初始问题简单的以为是kuboard出问题了&#xff0c;理论上来说重新安装kuboard即可&#xff0c; 由此问题引发的系统bug&#xff0c;导致master节点…

【LeetCode热题100】322. 零钱兑换(动态规划)

一.题目要求 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是…

​SCP收容物999

注 &#xff1a;本文是特别版&#xff0c;本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 物品号:SCP-999 --------------------------------…

从输入URL到页面渲染的全过程详解

当我们在浏览器中输入一个URL并按下回车键时&#xff0c;背后其实发生了一系列的复杂过程。这个过程涉及到了网络协议、服务器处理、数据传输等多个环节。下面&#xff0c;我们将详细解析这一过程。 一、URL解析 当我们在浏览器中输入URL并回车后&#xff0c;浏览器首先会进行…

掼蛋八大定律

1、首引定律 沟通是掼蛋的灵魂&#xff0c;原则上前三手牌都需要沟通。第一手牌&#xff0c;沟通牌力强弱&#xff1b;第二手牌沟通上游概率&#xff1b;第三手牌沟通双下可能。首引定律有几个公式&#xff1a;&#xff08;1&#xff09;首引小单牌示弱&#xff1b;&#xff0…

安装车载电台需要什么资质?

安装车载电台需要以下资质和步骤&#xff1a; 加入无线电运动协会&#xff0c;成为其会员。这是获取操作车载电台资格的基础。通过自学、培训或其他方式&#xff0c;取得《中华人民共和国业余电台操作证书》。这个证书是合法操作业余无线电台的凭证&#xff0c;也体现了操作者…

vue前端项目到后端执行逻辑——自己改的话要怎么改

文章目录 vue前端项目到后端流程——自己改的话要怎么改 vue前端项目到后端流程——自己改的话要怎么改

yarn集群部署

yarn集群部署案例 我们来基于一个案例讲解yarn集群部署 我们要部署yarn集群&#xff0c;需要分别部署HDFS文件系统及YARN集群 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点DataNode进程作为工作节点SecondaryNamenode作为辅助 同…

数据库基础认识

目录 数据库基本认识 见一见数据库 主流数据库 Windows下启动MySQL 服务器&#xff0c;数据库&#xff0c;表关系 MySQL架构 SQL分类 存储引擎 数据库基本认识 哪一个是客户端哪一个是服务端&#xff1f; 为什么需要数据库&#xff1f; 文件保存数据有以下几个缺点&a…

蓝桥杯刷题 深度优先搜索-[2410]最大连通(C++)

问题描述 小蓝有一个 30 行 60 列的数字矩阵&#xff0c;矩阵中的每个数都是 0 或 1 。 110010000011111110101001001001101010111011011011101001111110 010000000001010001101100000010010110001111100010101100011110 00101110100010001111111111101000001001010101011100…

✌2024/4/4—力扣—盛最多水的容器

代码实现&#xff1a; 方法一&#xff1a;暴力解法——遍历左右边&#xff0c;找出所有面积&#xff0c;取最大值——超时 #define min(a, b) ((a) > (b) ? (b) : (a)) #define max(a, b) ((a) > (b) ? (a) : (b))int maxArea(int *height, int heightSize) {int ans …

企业级即时通讯软件有哪些?办公室沟通效率提升的必备工具

在现代企业运营中&#xff0c;高效的沟通是推动工作进展和加强团队协作的关键因素。企业级即时通讯软件作为提升办公室沟通效率的必备工具&#xff0c;不仅能够帮助员工快速交换信息&#xff0c;还能够整合多种办公功能&#xff0c;从而提高整体工作效率。以下是几款国内优秀的…

基于liorf_localization的重定位

文章目录 概述保存和加载地图利用现有地图进行重定位代码实现Q&&AQ1: point cloud is not in dense format概述 在LIO-SAM的基础上进行重定位,主要是指在已经建立的地图上进行位置的快速定位,这对于机器人在已知环境中的快速启动或者在丢失定位后的恢复尤为重要。L…