行业资讯
代码随想录算法训练营第五天|242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和
242.有效的字母异位词看到题目的第一想法题目的意思就是说给两个字符串判断两个字符串里面的相同字母个数是不是一样的。那我遍历我的第一个字符串记录下它的字母个数然后再遍历我第二个字符串记下它字母个数一比较就OK了。看完代码随想录的第一想法遍历字符串的想法是正确的但是我缺少了如何记录字母个数的方法。用上哈希表的话确实就能记录字母的个数。这里有两个很妙的点第一个就是能把数组当做哈希表来使用。第二个就是通过将字符串遍历出来的字母减去字符串a就能得到0至25中的任意一个数再以这个数作为数组的地址变化的值作为数组的值。这样就能精准地26个字母的数量。用自己的话描述首先设置一个26位的数组a。开始遍历第一个字符串字符串遍历出来的字母减去字符串a就能得到0~25中的任意一个数num1在数组a中的num位置加1。直到将第一个字符串遍历完成开始遍历第二个字符串用同样的方法得到num2在数组a中num2的位置进行减1。最后遍历这个数组a如果其中有一项不为0就return false否则return true代码classSolution{publicbooleanisAnagram(Strings,Stringt){//首先设置一个26位的数组a。int[]anewint[26];//开始遍历第一个字符串字符串遍历出来的字母减去字符串a就能得到0~25中的任意一个数num1//在数组a中的num位置加1。直到将第一个字符串遍历完成for(inti0;is.length();i){a[s.charAt(i)-a];}//开始遍历第二个字符串用同样的方法得到num2在数组a中num2的位置进行减1。for(inti0;it.length();i){a[t.charAt(i)-a]--;}//最后遍历这个数组a如果其中有一项不为0就return false否则return truefor(intcount:a){if(count!0){returnfalse;}}returntrue;}}实现过程中遇到哪些困难思路通了之后就没有遇到什么困难了。今日收获记录一下自己的学习时长第一个收获能把数组当做哈希表来使用。第二个收获字母减去字符串 a就能得到这个字母是在字母表中的第几个数。以此可以去创作一个数组版的字母表。大概一个小时349.两个数组的交集看到题目的第一想法题目的意思就是说给两个数组看看他们之中的交集。输出这个交集的数组。看到这一题我就想着和上一题差不多思路的写法。将这两个数组的数字都存到两个新的数组a,b中以数字为地址值存数字的个数。然后再遍历两个数组a,b。如果同时都不为零。将这个数组的地址存入另一个新数组c中。最后输出新数组c。看完代码随想录的第一想法1.用数组来做哈希的题目都是因为题目限制了数值的大小。而且如果哈希值比较少、特别分散、跨度非常大使用数组就造成空间的极大浪费。本题后面 力扣改了 题目描述 和 后台测试数据增添了 数值范围1 nums1.length, nums2.length 10000 nums1[i], nums2[i] 1000所以就可以 使用数组来做哈希表了 因为数组都是 1000以内的。2.这一题主要是学会使用一种哈希数据结构unordered_set要留意题目说明输出结果中的每个元素一定是唯一的也就是说输出的结果的去重的 同时可以不考虑输出结果的顺序版本一使用HashSet用自己的话描述先是创建两个哈希集合set1,reset。set1用于记录num1的内容并去重reset用于记录set1和num2的交集。遍历数组num2同时问set1中是否存在如果存在就加入reset中。另外申请一个数组存放reset中的元素,最后返回数组代码classSolution{publicint[]intersection(int[]nums1,int[]nums2){//忘记处理边界值要创建一个空数组必须明确指定长度或显式提供初始化元素new int[0]或new int[] {}if(nums1null||nums1.length0||nums2null||nums2.length0){returnnewint[0];}//先是创建两个哈希集合set1,reset。//set1用于记录num1的内容并去重reset用于记录set1和num2的交集SetIntegerset1newHashSet();SetIntegerreSetnewHashSet();//遍历数组num1for(inti:nums1){set1.add(i);}//遍历数组num2同时问set1中是否存在如果存在就加入reset中for(inti:nums2){if(set1.contains(i)){reSet.add(i);}}//方法1将结果集合转成数组/** * 将 SetInteger 转换为 int[] 数组 * 1. stream() : Collection 接口的方法将集合转换为 StreamInteger * 2. mapToInt(Integer::intValue) : * - 中间操作将 StreamInteger 转换为 IntStream * - 使用方法引用 Integer::intValue将 Integer 对象拆箱为 int 基本类型 * 3. toArray() : 终端操作将 IntStream 转换为 int[] 数组。 */returnreSet.stream().mapToInt(Integer::intValue).toArray();//方法2另外申请一个数组存放reset中的元素,最后返回数组int[]arrnewint[reSet.size()];intj0;for(inti:reSet){arr[j]i;}returnarr;}}版本二使用Hash数组用自己的话描述将这两个数组的数字都存到两个新的数组a,b中以数字为地址值存数字的个数。然后再遍历两个数组a,b。如果同时都不为零。将这个数组的地址存入另一个新动态数组c中。代码classSolution{publicint[]intersection(int[]nums1,int[]nums2){//将这两个数组的数字都存到两个新的数组a,b中以数字为地址值存数字的个数。int[]anewint[1024];int[]bnewint[1024];for(inti:nums1){a[i];}for(inti:nums2){b[i];}//然后再遍历两个数组a,b。如果同时都不为零。将这个数组的地址存入另一个新动态数组c中。ListIntegercnewArrayList();for(inti0;i1024;i){if(a[i]0b[i]0){c.add(i);}}//方法1将结果动态数组c转成数组// return c.stream().mapToInt(Integer :: intValue).toArray();//方法2另外申请一个数组存放动态数组c中的元素,最后返回数组int[]arrnewint[c.size()];intj0;for(inti:c){arr[j]i;}returnarr;}}实现过程中遇到哪些困难没有遇到什么困难今日收获记录一下自己的学习时长学会了return c.stream().mapToInt(Integer :: intValue).toArray();快速将Integer类型的值快速拆为int类型数组。HashSet有着去重效果202.快乐数看到题目的第一想法快乐数有多快乐结果毫无头绪看完代码随想录的第一想法读懂题目真的挺重要的。1.理解无限循环 -求和的过程中sum会重复出现 2.记住这句当我们遇到了要快速判断一个元素是否出现集合里的时候就要考虑哈希法了我确实是不会这一题下面是我看完题解后的理解用自己的话描述首先给你个数。比如说这个数是19。题目要求你将1和9平方之后加在一起。于是得到了82。根据例子经过两次相同计算就会得到1。那么你就已经初步理解了题目。关键在于不断循环下去只会有两个结果一个是得到1另外一个是无限循环。而无限循环的另一个理解就是得到一个过往得到的数。那么这个时候你就已经有了初步的思路。开始理清整个题目的脉络首先这个数n 19传了进去。n要进入循环这个循环继续的条件就是得到n ! 1或者得到哈希集合record中没有的数record.contains(n)。这个哈希集合一开始是没有数的进去循环的第一步我就要先把一开始的数n传入哈希集合record中。这样这个哈希集合record利用它无序、不重复的特点。创造出了循环退出的条件。即是n 1或record.contains(n)。开始拆分19这个数字。替换循环的数n。如果这个数n不在record中进入下一轮循环如果record.contains(n)或者n 1那么就那这个n和1进行比较如果n 1,就返回true如果n ! 1 就返回false代码classSolution{publicbooleanisHappy(intn){//创建一个哈希集合用于记录不重复的数SetIntegerrecordnewHashSet();//设置循环继续的条件为n ! 1 !record.contains(n)反之如果n 1 || record.contains(n)while(n!1!record.contains(n)){//记录不重复的数进入哈希集合record.add(n);//将n里面的数进行拆分计算放回n里面。ngetNextNumber(n);}//n和1进行比较如果n 1,就返回true如果n ! 1 就返回falsereturnn1;}privateintgetNextNumber(intn){//先设一个加起来的数intnum0;//拆分数字要用循环while(n0){inttemp0;tempn%10;numtemp*temp;nn/10;}returnnum;}}实现过程中遇到哪些困难1.对于无限循环不能理解他隐藏的意思2.想不到怎么使用哈希法今日收获记录一下自己的学习时长1.收获了对题意的理解对无限循环的理解也更加深刻2.收获了对数的处理可以放到另一个函数中去。学习时长大约是1小时1.两数之和看到题目的第一想法有一点思路遍历第一个数加上遍历第二个数应该做个嵌套的for循环就解决了看完代码随想录的第一想法刚刚那个想法也是可以的那种是属于暴力的解法。代码随想录的这个用HashMap解决的做法会跟高级一些。其原理也简单易懂。但还是有一点要知道在什么时候用哈希法在查看这个元素在不在集合中一个元素有没有出现过。这个题目就属于要查看已经存入HashMap中的值有没有需要的用自己的话描述就是遍历当前数组中的元素计算出当前元素需要的目标元素然后去HashMap中寻找如果找到了就将当前元素和目标元素的下标存入数组res中没找到就将当前元素存入HashMap中key为当前元素value为当前元素的下标。代码classSolution{publicint[]twoSum(int[]nums,inttarget){// 就是遍历当前数组中的元素计算出当前元素需要的目标元素然后去HashMap中寻找如果找到了就将当前元素和目标元素的下标存入数组res中没找到就将当前元素存入HashMap中key为当前元素value为当前元素的下标。int[]resnewint[2];MapInteger,IntegerrecordnewHashMap();// 就是遍历当前数组中的元素for(inti0;inums.length;i){//计算出当前元素需要的目标元素inttemptarget-nums[i];// 去HashMap中寻找如果找到了就将当前元素和目标元素的下标存入数组res中没找到就将当前元素存入HashMap中if(record.containsKey(temp)){res[0]record.get(temp);res[1]i;break;}record.put(nums[i],i);}//返回当前数组resreturnres;}}实现过程中遇到哪些困难思路有了就没什么困难今日收获记录一下自己的学习时长学习了怎么用HashMap这个数据结构。半个小时
郑州网站建设
网页设计
企业官网