在求解某个元素是否在另一个表中存在时,第一时间想到用哈希表,然后根据具体问题考虑具体用哪一种hash结构
242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
思路: 1.核心是判断s字符串中每个字符出现的次数与t字符串中每个字符出现的次数是否相同 2.因此创建一个数组,该数组长度为26,用来存放s字符串字母出现的次数,用数组索引对应字母 3.遍历s字符串,把s字符串中出现的字母在数组中++ 4.遍历t字符串,把t字符串中出现的字母在数组中-- 5.最后遍历数组,如果数组中有不为0的元素,则返回false class Solution { public boolean isAnagram(String s, String t) { int[] arr = new int[26];//int型数组, for(int i = 0 ; i < s.length() ; i++){ arr[s.charAt(i)-'a']++; //这里是查看s.charAt,而不是arr.charAt } for(int i = 0 ; i < t.length() ; i++){ arr[t.charAt(i)-'a']--; } for(int i = 0 ; i < arr.length ; i++){ if(arr[i] != 0) return false; } return true; } }
349. 两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思路: 1.因为要求结果中每个元素都是唯一的,因此用set集合 2.遍历num1,把遍历到的元素输入到set1集合中 3.遍历num2,判断遍历到的元素是否存在于set1中 4.如果存在于set1中,则该元素为相交元素,因此把该元素存入另一个set集合中(因为题目要求结果集不能有重复元素) 5.return结果集:需要把set集合转化成数组,可以新建一个数组,然后遍历set2,输入到新数组中,最后返回数组 class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set =new HashSet(); Set<Integer> set1 = new HashSet(); for (int i = 0 ;i<nums1.length ; i++){ set.add(nums1[i]); } for (int i = 0 ;i<nums2.length ; i++){ if(set.contains(nums2[i])){ set1.add(nums2[i]); } } int[] arr = new int[set1.size()]; int j = 0 ; for(int i : set1){ arr[j++]=i; } return arr; } }
202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false
思路: 1.根据题目,需要定义一个返回值类型为boolean的函数,同时也需要另一个函数用于确定下一个n的数值 2.题目中说数字可能无限循环或者最终变成1,因此需要用到哈希结构,如果数字出现的重复,则代表一定陷入的循环,因为一旦某个数字一样,后边的数字也一定一样 3.把获取到的数字放到set中,判断是否已经存在,如果不存在则继续获取下一个数字,如果不满足while则跳出循环,即n=1或遇到循环,此时跳出循环,判断n是否为1,直接return n == 1;如果等于1会直接返回true,否则返回false class Solution { public boolean isHappy(int n) { Set set = new HashSet(); while(n != 1 && !set.contains(n)){ set.add(n); n = getNext(n); } return n ==1; } public int getNext(int n){ int sum = 0; while(n > 0){ int tmp = n % 10; sum += tmp*tmp; n = n / 10; } return sum; } }
1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路: 1.因为本题是需要找到元素以及索引下标,需要按键值对存储,因此需要用到hash结构中的map 2.判断目标值减去nums数组里的元素,是否已经遍历过,如果已经遍历过,则返回当前nums数组的索引,以及target-nums[i]的索引,如果没有遍历过,则把当前遍历的nums元素插入到map中 3.对nums的遍历结束后,如果遍历时没有return,则代表没有找到符合条件的内容,因此返回一个new的空数组 class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map = new HashMap<>();//这里要使用泛型限制,否则在map.get索引时,会报错(object无法转换成int) for(int i = 0 ;i < nums.length ; i++){ if(map.containsKey(target-nums[i])){ return new int[]{map.get(target-nums[i]),i}; } map.put(nums[i],i); } return new int[0]; } }