1、两个数组的交集 II
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
代码如下:必须说明的是,下面的代码前两个都没有通过,第三个方法已经通过了,互相学习,我也是看了别人代码才知道的。
class Solution:
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
### the first method ,but have not passed
# length1 = len(nums1)
# length2 = len(nums2)
# if length1 > length2:
# target = [i for i in nums2 if i in nums1]
# else:
# target = [i for i in nums1 if i in nums2]
# return target
### the second method ,but have not passed
# target = []
# length1 = len(nums1)
# length2 = len(nums2)
# for i in nums2:
# if i in nums1:
# target.append(i)
# nums2.pop(nums2.index(i))
# return target
#### the third method
record, res = {}, []
for num in nums1:
record[num] = record.get(num, 0) + 1
for num in nums2:
if num in record and record[num]:
res.append(num)
record[num] -= 1
return res
2、移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
代码如下:第二种方法没有通过,第一种方法通过了。
class Solution:
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
count = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[count] = nums[i]
count += 1
nums[count:] = [0] * (len(nums) - count)
# return nums
##### the second method
# new_array = []
# for i in range(len(nums)):
# if nums[i] != 0:
# new_array.append(nums[i])
# for j in range(len(new_array)):
# nums[j] = new_array[j]
# for k in range(len(new_array), len(nums)):
# nums[k] = 0
# return nums