算法(三)

哈希表算法章节

(1)

Ascall码文章推荐

  • 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
  • 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
class Solution {public boolean isAnagram(String s, String t) {//先说明一下字母异位词的定义://两个字符串的字母组成完全相同//这里使用哈希法//简单创建一个哈希数组:int[] hashint hash[] =new int[26];//默认初始化都为0//因为表示26个小写字母('a'到'z')//'a'-'a'=0存储在hash[0],  'b'-'a'=1存储在hash[1]以此类推//开始分别遍历两个字符串for(int i=0;i<s.length();i++){hash[s.charAt(i)-'a']++;}for(int j=0;j<t.length();j++){hash[t.charAt(j)-'a']--;}//检查hash数组中是否有不为0的元素for(int i=0;i<hash.length;i++){if(hash[i]!=0){return false;}}return true;}
}

(2)

当我们需要存储一组元素,并且要求元素不重复时,可以使用Set集合。

  • Set是Java中的一个接口,它的实现类有HashSet、TreeSet和LinkedHashSet。
  • HashSet:使用哈希表实现,不保证元素的顺序,是最常用的Set实现类。
  • TreeSet:使用红黑树实现,可以对元素进行排序,但插入和查找操作的时间复杂度较高。
  • LinkedHashSet:使用链表和哈希表实现,保证元素的插入顺序。
  • 当我们向Set集合中添加元素时,Set会根据元素的hashCode值来判断是否已存在相同的元素。
    如果两个元素的hashCode值相等,Set会调用它们的equals方法进行进一步比较。

具体步骤如下:

  1. 创建两个Set集合,分别用来存储两个数组的元素。
  2. 遍历第一个数组,将每个元素添加到第一个Set集合中。
  3. 遍历第二个数组,对于每个元素,判断是否存在于第一个Set集合中。
  4. 如果存在,则将该元素添加到结果集合中。
  5. 最后,将结果集合转换为整数数组并返回。
class Solution {public int[] intersection(int[] nums1, int[] nums2) {// 创建两个Set集合,用于存储数组元素Set<Integer> set1 = new HashSet<>();Set<Integer> resultSet = new HashSet<>();// 将nums1数组的元素添加到set1集合中for (int num : nums1) {set1.add(num);}// 遍历nums2数组,判断元素是否存在于set1集合中for (int num : nums2) {if (set1.contains(num)) {resultSet.add(num);}}// 将结果集合转换为整数数组int[] resultArray = new int[resultSet.size()];int index = 0;for (int num : resultSet) {resultArray[index] = num;index++;}return resultArray;}
}

(3)双指针法——快乐数

  • 编写一个算法来判断一个数 n 是不是快乐数。
  • 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环,但始终变不到 1。
  • 如果 可以变为 1,那么这个数就是快乐数。
  • 如果 n 是快乐数就返回 True ;不是,则返回 False 。

解释一下快乐数:

  • 不是所有的正整数都会进入循环。事实上,只有一部分正整数会进入循环,而另一部分正整数最终会收敛到1。
  • 对于那些会进入循环的正整数,它们的平方和计算过程会在某个特定的数值上循环,而不是收敛到1。这些数被称为“不快乐数”。
  • 例如,考虑数字4。计算过程如下:4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4。可以看到,进入了一个循环。因此,4被认为是一个不快乐数,因为它最终无法收敛到1。
  • 另一方面,如果一个正整数最终收敛到1,那么它被称为“快乐数”。例如,数字19通过计算平方和的过程最终收敛到1:19 -> 82 -> 68-> 100 -> 1。因此,19被认为是一个快乐数。
class Solution {public boolean isHappy(int n) {int slow = n; // 慢指针从n开始int fast = n; // 快指针从n开始do {slow = calculateSquareSum(slow); // 慢指针每次计算平方和fast = calculateSquareSum(calculateSquareSum(fast)); // 快指针每次计算两次平方和} while (slow != fast); // 当慢指针和快指针相等时,表示进入了循环return slow == 1; // 如果最终平方和等于1,说明是快乐数}private static int calculateSquareSum(int num) {int sum = 0;while (num > 0) {int digit = num % 10; // 取出个位数sum += digit * digit; // 平方和累加num /= 10; // 去除个位数}return sum;}}

以前觉得算法可无聊了,突然发现,这玩意挺上瘾啊,虽然很菜,但很解困啊🍚🍚🍚🍚🍚🍚🍚🍗🍗🍗🍗🍭🍭🍭🍭🍭🍭🍭🍭🧃🧃🧃🧃🧃🍵🍵🍵🍵🍵🍵💫💫💫💫😋😋😋😋😋😋

(4)两数之和

题目:

  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
  • 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
  • 你可以按任意顺序返回答案。
class Solution {public int[] twoSum(int[] nums, int target) {// 创建一个HashMap,用于存储数组元素与其下标的映射关系Map<Integer, Integer> map = new HashMap<>();// 遍历数组for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];// 判断当前元素的补数是否已经存在于HashMap中// 如果存在,则返回对应的下标if (map.containsKey(complement)) {return new int[] {map.get(complement), i};}// 如果补数不存在于HashMap中,则将当前元素与其下标存入HashMapmap.put(nums[i], i);}// 如果未找到符合条件的两个数,则返回一个空数组return new int[0];}
}

(5)四数相加

  • 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
  • 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1 。

map.getOrDefault(sum, 0) + 1

是Java中的一个表达式,用于获取Map中指定键的值,如果键不存在则返回默认值。在这个表达式中,sum是作为键,0是作为默认值。如果sum这个键存在于map中,则返回与该键对应的值加1;如果sum这个键不存在,则返回默认值0加1。

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;}
}

(6)三数之和

  • 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0
  • 请你找出所有满足条件且不重复的三元组。
  • 注意: 答案中不可以包含重复的三元组。
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 - 2; i++) {if (i > 0 && nums[i] == nums[i-1]) {continue;}int left = i + 1;int right = nums.length - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {result.add(Arrays.asList(nums[i], nums[left], nums[right]));while (left < right && nums[left] == nums[left+1]) {left++;}while (left < right && nums[right] == nums[right-1]) {right--;}left++;right--;} else if (sum < 0) {left++;} else {right--;}}}return result;}
}

(7)四数之和

  • 题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?
  • 找出所有满足条件且不重复的四元组。
  • 注意:答案中不可以包含重复的四元组。
class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result = new ArrayList<>();if (nums == null || nums.length < 4) {return result;}Arrays.sort(nums);for (int i = 0; i < nums.length - 3; i++) {// 避免重复的元素if (i > 0 && nums[i] == nums[i - 1]) {continue;}for (int j = i + 1; j < nums.length - 2; j++) {// 避免重复的元素if (j > i + 1 && nums[j] == nums[j - 1]) {continue;}int left = j + 1;int right = nums.length - 1;while (left < right) {int sum = nums[i] + nums[j] + nums[left] + nums[right];if (sum == target) {result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));// 避免重复的元素while (left < right && nums[left] == nums[left + 1]) {left++;}while (left < right && nums[right] == nums[right - 1]) {right--;}left++;right--;} else if (sum < target) {left++;} else {right--;}}}}return result;}
}

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

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

相关文章

帆软BI开发-Day2-趋势图的多种变形

前言&#xff1a; 在BI数据展示中&#xff0c;条形图、趋势图无疑是使用场景非常多的两种图形。与条形图不同的是&#xff0c;趋势图更能反馈出一定的客观规律和未来的趋势走向&#xff0c;因此用于作为预警和判异的业务场景&#xff0c;但实际业务场景的趋势图可没你想的那么简…

Python阴阳历日期转换

阳历转阴&#xff08;殷&#xff09;历&#xff0c;阴历转阳历&#xff0c;了解一下阴阳历的转换逻辑、闰月的转换。 农历&#xff0c;古时称为夏历&#xff0c;是中国现行的传统历法&#xff0c; 属于阴历和阳历的合历&#xff0c;根据月相的变化周期一个月&#xff0c;参…

Eclipse工具使用技巧

1、常用快捷键 ctrlshifto 快速导包 CtrlSpace 内容助理 说明:内容助理。提供对方法,变量,参数,javadoc等得提示,应运在多种场合,总之需要提示的时候可先按此快捷键。注:避免输入法的切换设置与此设置冲突 CtrlShiftSpace 变量提示 Ctrl/ 添加/消除//注释 CtrlShift/ 添加…

华为HCIA(三)

链路本地地址接口标识64bit 当STP端口到了Forwarding状态后&#xff0c;会转发流量&#xff0c;也处理报文 在TCP/IP模型中&#xff0c;会话层&#xff0c;表示层和应用层&#xff0c;都规划成了应用层 路由表包含目的地址和掩码&#xff0c;优先级&#xff0c;cost,下一跳和…

JWT令牌

一、JWT&#xff08;Json Web Token&#xff09;能干什么 1、安全认证&#xff08;权限认证&#xff09; 比如登录系统的时候&#xff0c;服务器会检查前端请求数据中携带的token信息&#xff0c;符合标准则允许访问&#xff0c;不符合则拒绝你的访问请求。 2、信息传递 比…

laravel框架 - 事件与监听器

一&#xff0c;绑定事件与监听器 在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器 protected $listen [Registered::class > [SendEmailVerificationNotification::class,],App\ebvent\RegisterMessage>[//事件App\listeners\SendMessage//监…

高云FPGA系列教程(10):letter-shell移植

文章目录 letter-shell简介letter-shell源码获取letter-shell移植函数和变量应用示例 本文是高云FPGA系列教程的第10篇文章。 shell&#xff0c;中文是外壳的意思&#xff0c;就是操作系统的外壳。通过shell命令可以操作和控制操作系统&#xff0c;比如Linux中的Shell命令就包括…

QT--day5

注册 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include <QMessageBox> #include<QString> #include<QSqlDatabase> …

CAN总线物理层

本文的目的并不是为了介绍或普及CAN总线相关知识,而是为了了解CAN总线,进而为CAN通信一致性测试做知识储备。 CAN,控制器局域网,全称:Controller Area Network。1986年,由德国Bosch公司为汽车开发的网络技术,主要用于汽车的监测与控制,目的为适应汽车“减少线束的数量…

1787_函数指针的使用

全部学习汇总&#xff1a;GitHub - GreyZhang/c_basic: little bits of c. 前阵子似乎写了不少错代码&#xff0c;因为对函数指针的理解还不够。今天晚上似乎总算是梳理出了一点眉目&#xff0c;在先前自己写过的代码工程中做一下测试。 先前实现过一个归并排序算法&#xff0c…

1999-2018年地级市不同所有制成分工业总产值数据

1999-2018年地级市不同所有制成分工业总产值数据 1、时间&#xff1a;1999-2018年 2、范围&#xff1a;地级市 3、指标&#xff1a;行政区划代码、城市、年份、规模以上工业企业数_全市_个、规模以上工业企业数_市辖区_个、规模以上内资企业数_全市_个、规模以上内资企业数_…

【AI视野·今日CV 计算机视觉论文速览 第250期】Wed, 20 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Wed, 20 Sep 2023 Totally 95 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers PanopticNeRF-360: Panoramic 3D-to-2D Label Transfer in Urban Scenes Authors Xiao Fu, Shangzhan Zhang, Tianrun Chen…

满足开闭原则的JDBCUtils~

我们都知道开闭原则即为对修改关闭&#xff0c;对拓展开放&#xff0c;那么对于实现既能通过DriverManager连接数据库&#xff0c;也能实现使用c3P0连接数据库&#xff0c;连接数据库的方式即为可变点&#xff0c;我们只需要使用抽象类或者接口封装可变点&#xff0c;再将可变点…

ip地址的正则表达式

ip地址的正则表达式 checkIpSpecial: {// 验证IP地址validator: function (value) {// var reg /^((1?\d?\d|(2([0-4]\d|5[0-5])))\.){3}(1?\d?\d|(2([0-4]\d|5[0-5])))$/;这个正则表达式的意思是&#xff1a;以数字开头&#xff0c;紧接着是一个点&#xff0c;然后再是数…

SecureCRT SSH与FTP连接中文乱码

1、首先要保证服务端环境变量是UTF-8编码的 LANG”zh_CN.UTF-8″ 2、会话里面配置好字符编码&#xff1a;UTF-8 SSH会话的窗口就可以正常显示中文了&#xff0c;效果如下 3、打开FTP或者SFTP时进行文件传输时&#xff0c;列表窗口里面还是乱码&#xff0c;需要把SecureCRT安…

猜数游戏 rust解法

给定答案序列和猜测序列&#xff0c;统计有几个数字位置正确&#xff0c;有几个数字在两个序列都出现过但位置不对。 输入包含多组数据。每组第一行是序列长度n&#xff0c;第二行是答案序列&#xff0c;接下来若干行是猜测序列。猜测序列全0时该组结束。n0时整个输入结束。 样…

【知识分享】Java获取当前日期是第几周且本周是几号到几号

加哥今天给大家提供一个获取当前日期是本年度的第几周的方法&#xff0c;且这周是几号到几号的工具类&#xff0c;供大家使用。 public static void main(String[] args) {//使用当前时间戳 System.currentTimeMillis()Current_week(System.currentTimeMillis()); }public st…

周界警戒AI算法+视频智能分析在安全生产场景中的应用

长期以来&#xff0c;周界防范安防系统在大型园区、工厂、社区、机场、火车站站台、重点单位等领域应用较为广泛和常见。随着AI人工智能等新兴技术的快速发展与落地应用&#xff0c;通过AI智能检测与视频智能分析技术&#xff0c;现代化的周界安防系统可以做到全天候快速、准确…

科普:什么是视频监控平台?如何应用在场景中?

随着科技的发展&#xff0c;监控无处不在&#xff0c;就像一张密不透风的网&#xff0c;将生活中的角角落落都编织在一起。可是&#xff0c;你真的知道什么是安防视频监控平台吗&#xff1f;它可不止是一个简单的通电摄像头&#xff0c;如今的视频监控平台&#xff0c;涵盖了无…

Python爬虫基础(三):使用Selenium动态加载网页

文章目录 系列文章索引一、Selenium简介1、什么是selenium&#xff1f;2、为什么使用selenium3、安装selenium&#xff08;1&#xff09;谷歌浏览器驱动下载安装&#xff08;2&#xff09;安装selenium 二、Selenium使用1、简单使用2、元素定位3、获取元素信息4、交互 三、Phan…