今天在力扣上刷了一道题,然后学习了3个小时的java,学习了面向对象中有关构造方法,方法重载和继承相关的知识点,最重要的可能就是继承了,继承的作用是为了提高代码的复用,继承可以让子类获得的父类所有功能。但是在使用这些功能时也会有很多的注意事项,比如如果父类没有默认的构造方法,子类就必须显式调用super()
并给出参数以便让编译器定位到父类的一个合适的构造方法。还有有关转型的问题,以及sealed修饰的父类会明确写出能够从该父类继承的子类名称。
接下来就是我今天写的一道题了。
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小,哪种方法更优?
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
我使用的是排序然后用指针来进行比较做到题目的要求,当指针所指的元素相同时,就可以进行输出,如果不同就将元素小的向后面移动,这样就可以找到两个数组中相同的部分。
代码如下
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int l1 = nums1.size();
int l2 = nums2.size();
vector<int> s;
int i1 = 0, i2 = 0;
while (i1 < l1 && i2 < l2) {
if (nums1[i1] < nums2[i2]) {
i1++;
} else if (nums1[i1] > nums2[i2]) {
i2++;
} else {
s.push_back(nums2[i2]);
i1++;
i2++;
}
}
return s;
}
};
今天的总结就到这里了。