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