两个数组的交集
link:349. 两个数组的交集 - 力扣(LeetCode)
思路分析
首先想到合并两个数组,遍历找重复项存储到新的数组中但其实用HashSet是更加方便的,【HashSet不存在重复数据】
**注意:使用数组做哈希表的题目都限制了大小 例如只有小写字母或者数值大小在【0-1000】内 **
HashSet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import java.util.HashSet; import java.util.Set;
class Solution { public int[] intersection(int[] nums1, int[] nums2) { if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0 ) { return new int[0]; } Set<Integer> set1 = new HashSet<>(); Set<Integer> set2 = new HashSet<>();
for(int i : nums1) { set1.add(i); } for(int i : nums2) { if(set1.contains(i)) { set2.add(i); } } int[] result = new int[set2.size()]; int k = 0; for(int i : set2) { result[k++] = i; } return result; } }
|
Tips
更高级的写法 Java8引入的流式API(Stream API)
1 2
| return set2.stream().mapToInt(x -> x).toArray();
|
**stream()
**:将集合转换为流对象,便于对集合进行链式操作.
**mapToInt(x -> x)
**:将流中的每个 Integer
元素转换为 int
类型(自动拆箱).
**toArray()
**:将流中的元素收集为一个 int[]
数组.
Hash数组
思路相同 只不过加了大小限制之后可以用Hash数组解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.util.HashSet; import java.util.Set;
class Solution { public int[] intersection(int[] nums1, int[] nums2) { int[] hash1 = new int[1002]; int[] hash2 = new int[1002]; for(int i : nums1) { hash1[i]++; } for(int i : nums2) { hash2[i]++; } List<Integer> result = new ArrayList<>(); for(int i = 0; i < 1002; i++) { if(hash1[i] > 0 && hash2[i] > 0) result.add(i); } int[] finalArray = new int[result.size()]; int index = 0; for(int i : result) { finalArray[index++] = i; } return finalArray; } }
|
快乐数
link:202. 快乐数 - 力扣(LeetCode)
思路分析
起初分析的时候被卡在了循环条件处【😓】,首先得不是1然后不满足快乐数条件最后不被包含在Hashset中.【是的没错是高贵的Hashset(bushi)】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public boolean isHappy(int n) { Set<Integer> result = new HashSet<>(); while(n != 1 && !result.contains(n)) { result.add(n); n = getNumber(n); } return n == 1; } private int getNumber(int n) { int res = 0; while(n > 0) { int tmp = n % 10; res += tmp * tmp; n = n / 10; } return res; } }
|
Tip
所有由此观之,所有判断元素是否出现过的题目都可以用哈希法解决.
一般哈希表都是用来快速判断一个元素是否出现集合里.