代码随想录算法训练营第六天| 242.有效字母的异位词、349.两个数组的交集、202快乐数、1.两数之和

系列文章目录


目录

  • 系列文章目录
  • 242.有效的字母异位词
  • 349. 两个数组的交集
    • ①使用HashSet
    • ②使用Hash数组
  • 202. 快乐数
  • 1. 两数之和
    • ①暴力解法(时间复杂度不符合要求)
    • ②使用HashMap法


242.有效的字母异位词

这道题是数组在哈希表中的典型应用。

因为只有26个小写字母,且这26个元素是连续的,所以采用数组这种数据结构。将字符串的字母减去字母a得到的就是从02526个字母的下标索引。数组的值就是元素出现的次数,也就是遍历到这个元素,对应的数组值就++。这样就记录了第一个字符串中每个元素出现的次数。再遍历第二个字符串,让数组值--,最后判断数组值是否全为0即可。

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 (Integer i : record) {if(i!=0){// record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。return false;}}return true; // record数组所有元素都为零0,说明字符串s和t是字母异位词}
}

349. 两个数组的交集

①使用HashSet

将第一个数组放到Set中,然后看第二个数组的值有没有在里面出现,出现的话就记录。

剪枝:在已知不符合条件的情况下,剪枝避免做无效判断。因为遍历本质是在决策,决策是为了求得结果,已知结果的决策就没有必要进行了。

        //判断条件if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){return new int[0];}
import java.util.HashSet;//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int[] intersection(int[] nums1, int[] nums2) {//判断条件if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){return new int[0];}HashSet<Integer> set1 = new HashSet<>();HashSet<Integer> set2 = new HashSet<>();//遍历数组1
/*        for (int i = 0; i < nums1.length; i++) {set1.add(nums1[i]);}*/for (int i : nums1) {set1.add(i);}//遍历数组2的过程中判断哈希表中是否存在该元素// ①如果加不进去,则说明该元素在第一个数组中存在// ②直接使用contains方法来查看集合中是否有该元素
/*        for (int i = 0; i < nums2.length; i++) {if (!set1.add(nums2[i])) {//①如果加不进去,则说明该元素在第一个数组中出现过set2.add(nums2[i]);}*/for (int i : nums2) {if (set1.contains(i)) {//②直接使用contains方法来查看集合中是否有该元素set2.add(i);}}
/*        //方法1:将结果集合转为数组return set2.stream().mapToInt(x -> x).toArray();*///方法2:另外申请一个数组存放setRes中的元素,最后返回数组int[] arr = new int[set2.size()];int i = 0;for (Integer setnum : set2) {arr[i++] = setnum;}return arr;}
}

在这里插入图片描述
Set 的常用方法:add:添加单个元素;size:获取元素个数。contains:查找元素是否存在;也可再次加入元素看能否加进去来判断元素是否存在。需要注意的是,SettoArray的方法,该方法是重写接口Collection的方法。可返回包含此集合中所有元素的数组。
在这里插入图片描述

但是转换成数组的元素类型是object,所以还是建议重新创建一个数组来存放Set集合中的值。

//方法1:将结果集合转为数组return set2.stream().mapToInt(x -> x).toArray();
//方法2:另外申请一个数组存放setRes中的元素,最后返回数组int[] arr = new int[set2.size()];int i = 0;for (Integer setnum : set2) {arr[i++] = setnum;}return arr;

②使用Hash数组

class Solution {                                                                             public int[] intersection(int[] nums1, int[] nums2) {                                    int[] hash1 = new int[1003];                                                         int[] hash2 = new int[1003];                                                         //nums1中出现的字母在hash1数组中做记录                                                            for (int i = 0; i < nums1.length; i++) {                                             hash1[nums1[i]]++;                                                               }                                                                                    //nums2中出现的字母在hash2数组中做记录                                                            for (int i = 0; i < nums2.length; i++) {                                             hash2[nums2[i]]++;                                                               }                                                                                    //创建一个实现List集合的实现类来存相同元素,                                                            // ArrayList效率比Vector高,改查效率比LinkedList高                                              ArrayList<Integer> resList = new ArrayList<>();                                      for (int i = 0; i < hash1.length; i++) {                                             if (hash1[i] > 0 && hash2[i] > 0) {//如果相同下标位置值都大于0,说明元素有交集                       resList.add(i);                                                              }                                                                                }                                                                                    //方法1:将结果集合转为数组                                      //return resList.stream().mapToInt(x -> x).toArray();//方法2:另外申请一个数组存放setRes中的元素,最后返回数组                    int[] arr = new int[resList.size()];                 int index = 0;                                       for (Integer i : resList) {                          arr[index++] = i;                                }                                                    return arr;                                                                                                                }                                                                                        

在这里插入图片描述
toArray方法是重写接口Collection的方法,故ArrayList也能调用toArray方法。

//方法1:将结果集合转为数组                                      return resList.stream().mapToInt(x -> x).toArray();
//方法2:另外申请一个数组存放setRes中的元素,最后返回数组                    int[] arr = new int[resList.size()];                 int index = 0;                                       for (Integer i : resList) {                          arr[index++] = i;                                }                                                    return arr;

202. 快乐数

①当不知道一个数是几位数时,求各个位上的平方和的方法要记住。就取这个数的个位(模,即%10),然后将这个数/10,再求个位,while循环,判断的条件是这个数>0

        int sum = 0;while (n > 0) {int temp = n % 10;//得到末位数sum += temp * temp;n = n / 10;//缩小一位}

②主方法isHappy中退出循环需要两个条件①n1。②集合中已有该元素。故最后在返回值时需return n == 1;来判断当退出循环时是否是满足第①条件退出的。

class Solution {public boolean isHappy(int n) {HashSet<Integer> set = new HashSet<>();/*       while (n != 1) {if (!(set.add(n))) {//加过集合的元素再加就为falsereturn false;}n = getNextNumber(n);}return true;*///退出该循环有两个条件:①n为1②集合中已有该元素while (n != 1 && !set.contains(n)) {set.add(n);n = getNextNumber(n);}return n == 1;}private int getNextNumber(int n) {int sum = 0;while (n > 0) {int temp = n % 10;//得到末位数sum += temp * temp;n = n / 10;//缩小一位}return sum;}
}

1. 两数之和

①暴力解法(时间复杂度不符合要求)

class Solution {public int[] twoSum(int[] nums, int target) {//暴力解法for (int i = 0; i < nums.length; i++) {for (int j = i+1; j < nums.length; j++) {if(nums[i]==target-nums[j]){return new int[]{i,j};}}}return new int[0];}
}

在这里插入图片描述

②使用HashMap法

Mapkey值有没有出现过的判断方法:containsKey()
剪枝(自己没写),若数组为null或者长度为0则直接返回退出:

        //剪枝(自己没写)if (nums == null || nums.length == 0) {return res;}
import java.util.HashMap;//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int[] twoSum(int[] nums, int target) {//使用HashMap法int[] res = new int[2];//只创建一个数组(自己创建了两个数组)//剪枝(自己没写)if (nums == null || nums.length == 0) {return res;}HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int temp = target - nums[i];// 遍历当前元素,并在map中寻找是否有匹配的keyif (map.containsKey(temp)) {//return new int[]{i, map.get(temp)};res[0] = i;res[1] = map.get(temp);return res;}map.put(nums[i], i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中}//return new int[0];return res;}
}
//leetcode submit region end(Prohibit modification and deletion)

在这里插入图片描述


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

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

相关文章

Frostmourne - Elasticsearch源日志告警配置

简介 配置Frostmourne 接入Elasticsearch源进行日志匹配告警&#xff0c;并静默规则&#xff0c;告警消息发送到企业微信&#xff0c;告警信息使用Markdown。 部署安装教程查看&#xff1a; https://songxwn.com/frostmourne_install ELK 安装教程&#xff1a;https://songx…

【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍开放封闭原则&#xff08;OCP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

【Linux】进程控制与进程调度

Linux进程介绍 进程的基本概念 Linux是多用户、多任务的操作系统。在这样的环境中&#xff0c;各种计算机资源的分配和管理都是以进程为单位进行的。 Linux操作系统包括三种不同类型的进程&#xff1a; 1&#xff09;交互进程&#xff1a;一种由Shell启动的进程。交互进程既可…

车辆监控系统:AI赋能黑科技,砼车监管有哨兵!

或许您也有兴趣看看这些&#xff1a; 超级调度 | 砼行ERP 搅拌站运转效率提高30% 生产控制 | 一机双控 省钱 省事 增收 智能地磅 | 自助过磅 料仓联动 自助卸料 管理系统 | 混凝土 用砼行 协同管理 | 智能制造 生产协同 ↓添加下方好友&#xff0c;获取更详细的资料

Windows从0到1部署项目

文章目录 1.创建虚拟机2.文件的传输--共享文件夹共享文件夹的访问 3.安装jdk&#xff0c;Tomcat3.1jdk的安装与配置配置环境变量 3.2Tomcat的安装与配置 4.安装mysql数据库5.下载nginx6.虚拟域名 因为Windows项目部署有很多操作都是博主之前做过的了&#xff0c;所及就只放了博…

Failed to open file:login.html段错误,核心已转储

目录 关于段错误 1.错误想象如下所示 2.相应代码 3.原因分析 4.段错误处理原则 关于段错误 "段错误"是一种常见的运行时错误&#xff0c;通常表示程序访问了无效的内存地址&#xff0c;导致操作系统终止了程序的执行并生成了核心转储文件。出现段错误的原因可能…

【漏洞复现】宏景HCM downlawbase SQL注入漏洞

0x01 产品简介 宏景人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景HCM downlawbase 接口处存在SQL注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&…

DJI RONIN 4D变0字节恢复案例

RONIN 4D这个产品听起来比较陌生&#xff0c;还是DJI大疆出品。没错&#xff0c;这是大疆进军影视级的重点明星机型。前阵子刚处理过大疆RONIN 4D的修复案例&#xff0c;下边这个案例是和exfat有关的老问题:文件长度变成0字节。 故障存储:希捷18T /MS Exfat文件系统。 故障现…

vue.js 页面中设置多个swiper

效果&#xff1a; 设置主要设置了 动态的 包含类、 左右按钮的类 <template><div class"swiper-container_other"><!-- 右侧按钮 --><div :class"[(id)?swiper-button-nextid:swiper-button-next, swiper-button-next]"></div…

【代码随想录 | 数组 01】二分查找

文章目录 1.二分查找1.1题目1.2思路&#xff08;核心&#xff1a;区间的定义&#xff09;1.3左闭右闭1.4左闭右开1.5总结 1.二分查找 1.1题目 704.二分查找—力扣题目链接 题目&#xff1a;给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 …

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2 - Card Identification

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2 - Card Identification 一、问题回顾二、本次的任务三、 需要注意的问题3.1 Card Identification Mode时的时钟频率3.2 CMD0指令的疑似问题3.3 发送带参数的ACMD41时要注意时间时序和时效3.4 CPSM的指令发送问题…

Python循环语句全解析(附实战演练)

目录 1. for 循环 2. while循环 3. 简单语句组 4. for...else语句 5. while ...else 语句 6. range() 函数 7. break & continue语句 8. 循环中的 else 子句 9. pass语句 10. 实战练习&#xff1a; 结语 前面学习了Python的六大数据类型、Python条件语句&#x…