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

本文主要是介绍代码随想录算法训练营Day6| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

242.有效的字母异位词

知识点补充:
1.遍历HashMap中的值:
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(Integer num:map.values()){ }
2.遍历HashMap的键:
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(Integer num:map.keySet()){ }
3.t.charAt(i)可以获取到字符串索引为i的字符
4.字符串获取长度方法:
str.length();
5.在Java中,字符类型(char)实际上是一个无符号的16位整数,它表示的是字符在Unicode字符集中的编码。对于ASCII字符集,字符’a’的Unicode编码是97,字符’b’的编码是98,以此类推,直到字符’z’的编码是122。当你执行s.charAt(i) - ‘a’时,你实际上是在计算字符和字符’a’之间的差值。这个差值将是一个整数,它表示字符在字母表中的位置。例如:
如果s.charAt(i)是’a’,那么s.charAt(i) - ‘a’的结果是0。
如果s.charAt(i)是’b’,那么s.charAt(i) - ‘a’的结果是1。
如果s.charAt(i)是’c’,那么s.charAt(i) - ‘a’的结果是2。
以此类推,直到
如果s.charAt(i)是’z’,那么s.charAt(i) - 'a’的结果是25。
这个计算结果(0到25的整数)可以直接用作数组索引,因为小写英文字母的数量正好是26个

法一:
1.将两个字符串预处理,转成字符数组
2.用HashMap存储出现的字符以及对应字符出现的次数
3.先往hashmap存其中一个字符数组的单词出现个数,再遍历另一个字符数组,出现map中的字母就–
4.判断map中每一个value是否为0,如果不为0就返回false

class Solution {public boolean isAnagram(String s, String t) {boolean res = true;char[] s_chars = s.toCharArray();char[] t_chars = t.toCharArray();HashMap<Character,Integer> existNumMap = new HashMap<Character,Integer>();for(char s_char:s_chars){if(existNumMap.containsKey(s_char)){int existNum = existNumMap.get(s_char);existNumMap.put(s_char,++existNum);} else{existNumMap.put(s_char,1);}}for(char t_char:t_chars){if(existNumMap.containsKey(t_char)){int existNum = existNumMap.get(t_char);existNumMap.put(t_char,--existNum);}else{res = false;} }//hashmap中value和key的遍历方式,总结一下for(Integer num:existNumMap.values()){if(num != 0) res = false;}return res;}
}

法二:
1.创建一个长度为26的数组record
2.record[s.charAt(i)-‘a’]++;记录字符串s中字符出现的次数
3.record[t.charAt(i)-‘a’]–;t字符串中字符出现一次对应减一次
4.最后判断record数组中是否全为0,全为0两个字符串中字符出现次数一样

class Solution {public boolean isAnagram(String s, String t) {int[] record = new int[26];//记录每一个字母出现的次数for(int i=0;i<s.length();i++){//字符串的长度方法.length()record[s.charAt(i)-'a']++;//出现一次就加一}for(int i=0;i<t.length();i++){record[t.charAt(i)-'a']--;//出现一次就减一}//如果两个字符串的字母出现次数一致,那么record中的所有值都是0for(int r:record){if(r != 0) return false;}return true;}
}

方法对比:
1.方法二相比于方法一,不需要创建两个字符数组,不需要创建HashMap,只要创建一个数组,消耗内存空间更小。
2.法一需要对每一个字符的value取值–>操作–>放回,而法二直接对数组进行修改,时间消耗更小。
3.时间和空间复杂度都是O(n),但是法二相比于法一时间和空间上都提升很多。

349. 两个数组的交集

知识点补充:
HashSet类型的集合和数组之间的转换:
int i = 0;
int[] result = new int[res.size()];
for(int num:res){
result[i] = num;
i++;
}
题解:
思路就是先遍历一个数组,将出现过的数组存入具有元素唯一特性的HashSet中,以收集该数组出现过的所有值。再遍历另一个数组,判断HashSet中是否有这个数字,如果出现就是两个数组的交集。

class Solution {public int[] intersection(int[] nums1, int[] nums2) {HashSet<Integer> set = new HashSet<Integer>();HashSet<Integer> res = new HashSet<Integer>();for(int num:nums1){set.add(num);}for(int num:nums2){if(set.contains(num)){res.add(num);}}int i = 0;int[] result = new int[res.size()];for(int num:res){result[i] = num;i++;}return result;}
}

202. 快乐数

这道题的关键是一个方法一个判断:一个方法是每次按照题目要求变换数字的方法,一个判断是判断是否进入循环以及是否为1的判断:
1.判断快乐数的方法:如果num如果大于等于0,就%10取余,得到的结果平方加入total;num = num/10得到下一个用来取余的数---->指导num小于10
2.创建一个set集合,存储每一个按照规则算出来的数,一旦出现之前已经加入到set的数了,说明开始循环了,就跳出while,res置为false,这个数不是快乐数。
如果算出来的数是1了,也会跳出while,返回res=true。

class Solution {public boolean isHappy(int n) {boolean res = true;HashSet<Integer> set = new HashSet<Integer>();set.add(n);while(n != 1){n = judgeHappy(n);if(set.contains(n)){res = false;break;}else{set.add(n);}}return res;}public int judgeHappy(int num){int total = 0;while(num >= 10){int a = num%10;total += a*a;num = num/10;}total += num*num;return total;}
}

1. 两数之和

**关键:**如果map中没有target-nums[i],说明在之前没有出现可以和当前数配对相加为target的数,那么就先把他加进map,等到那个输出现,再将他们的索引成对返回。

class Solution{public int[] twoSum(int[] nums,int target){HashMap<Integer,Integer> map = new HashMap<>();//创建一个mapfor(int i = 0;i<nums.length;i++){//如果map中没有target-nums[i],说明在之前没有出现可以和当前数配对相加为target的数,那么就先把他加进map,等到那个输出现,再将他们的索引成对返回。if(map.containsKey(target-nums[i])){return new int[]{map.get(target-nums[i]),i};}map.put(nums[i],i);}return new int[0];}
}

这篇关于代码随想录算法训练营Day6| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016009

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill