代码随想录算法训练营第五和六天【哈希表】242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
第五天是周末的休息日,嘿嘿,今天继续~
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
242.有效的字母异位词
心得:重点是了解思路,代码还是很简洁的。只需要存储26个字母,可以用数组实现。
1)定义一个长度为26的数组,数组的下标是,每个字符char-'a'
2)遍历字符串s,字母出现一次,则+1
3)遍历字符串t,字母出现一次,则-1
4)判断数组内长度是不是都为0
5)获取字符串s中的第i个字符,s.charAt(i)
class Solution { public boolean isAnagram(String s, String t) { int[] array = new int[26]; for(int i=0;i<s.length();i++){ array[s.charAt(i)-'a']++; } for(int i=0;i<t.length();i++){ array[t.charAt(i)-'a']--; } for(int i=0;i<array.length;i++){ if(array[i] != 0){ return false; } } return true; } }
349.两个数组的交集
心得:本题数据量较多,可选用set集合。整体思路不难,遍历第一个数组,存入set(set集合中不允许数据重复),遍历第二个数据,判断set集合中是否包含。重点要熟悉java中set集合相关语法。
1)初始化指定参数类型的set,Set<Integer> set = new HashSet<>()
2)添加数据,set.add()
3)判断集合中是否有某个元素,set.contains()
4)set集合转换为int数组,set.stream().mapToInt(x -> x).toArray()
class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set1 = new HashSet<>(); Set<Integer> set2 = new HashSet<>(); for(int i=0;i<nums1.length;i++){ set1.add(nums1[i]); } for(int i=0;i<nums2.length;i++){ if(set1.contains(nums2[i])){ set2.add(nums2[i]); } } return set2.stream().mapToInt(x -> x).toArray(); } }
202.快乐数
心得:核心是抓住题目中的“无限循环”,就是说求和的过程中,sum会重复出现。有了思路,实际敲代码中需要对计算熟悉,能够求出每个位置上的数字的平方和。
class Solution { public boolean isHappy(int n) { Set<Integer> set = new HashSet<>(); System.out.println("n"); while(!set.contains(n)){ set.add(n); System.out.println("n"); n = sumSquares(n); if(n == 1){ return true; } } return false; } int sumSquares(int n){ int sum = 0; while(n != 0){ int a = n%10; sum = sum+a*a; n = n/10; } return sum; } }
1.两数之和
心得:我们不仅要知道元素有没有遍历过,还有知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中。重点要熟悉java中map集合相关语法。
1)初始化指定参数类型的map,Map<Integer,Integer> map = new HashMap<>()
2)添加元素,map.put(key,value)
3)获取元素,map.get(key)
4)判断集合是否包含某个key,map.containsKey(key)
class Solution { public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; Map<Integer,Integer> map = new HashMap<>(); for(int i=0;i<nums.length;i++){ int diff = target-nums[i]; if(map.containsKey(diff)){ result[0] = map.get(diff); result[1] = i; break; } map.put(nums[i],i); } return result; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?