题目
给定两个数组,编写一个函数来计算它们的交集。
法一
双重遍历,找出交集,加入set(可以去重)
set转为list,list又转为int[] 型数组
代码简单就是很笨。
public int[] intersection(int[] nums1, int[] nums2) {
if (nums1.length == 0 || nums2.length == 0) {
return new int[0];
}
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
if (nums1[i] == nums2[j]) {
set.add(nums1[i]);
}
}
}
List<Integer> list = new ArrayList<>();
list.addAll(set);
int[] arr = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
arr[i] = list.get(i);
}
return arr;
}
法二
两个一重循环,第一重将nums1数组的元素加入set,第二重,去遍历nums2数组,找交集
注意要对list 去重。
最后运用jdk8新操作:int[] arr = list.stream().mapToInt(i -> i).toArray();
public int[] intersection2(int[] nums1, int[] nums2) {
if (nums1.length == 0 || nums2.length == 0) {
return new int[0];
}
List<Integer> list = new ArrayList<>();
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums1.length; i++) {
set.add(nums1[i]);
}
for (int j = 0; j < nums2.length; j++) {
if (set.contains(nums2[j]) && !list.contains(nums2[j])) {
list.add(nums2[j]);
}
}
return list.stream().mapToInt(i -> i).toArray();
}
但是吧这个 list.stream().mapToInt(i -> i).toArray(); 性能不是很好
法三
设立两个HashSet,一个用于存储nums1中的元素,一个用于存放两个数组的交集,还能直接去重。
public int[] intersection3(int[] nums1, int[] nums2) {
if (nums1.length == 0 || nums2.length == 0) {
return new int[0];
}
HashSet<Integer> set = new HashSet<>();
HashSet<Integer> res = new HashSet<>();
for (int i : nums1) {
set.add(i);
}
for (int i : nums2) {
if (set.contains(i)) {
res.add(i);
}
}
int[] arr = new int[res.size()];
int i = 0;
for (int num : res) {
arr[i++] = num;
}
return arr;
}
结果:
今日学到了
java list.stream().mapToInt(i -> i).toArray()
2.HashSet——>Array
int[] arr = new int[res.size()];
int i = 0;
for (int num : res) {
arr[i++] = num;
}
做题反思
努力思考,认真总结,不断优化,明日继续!
end.