字节飞书三面凉经,要是一面挂了还不伤心,越走到后面越伤心。

面试确实让我感到沮丧,特别是感觉自己没有发挥出全部水平。
对两个数组的交集和并集的题目其实挺基础的,但Promise.all的实现确实让我卡住了。
面试官在时间上也有所调整,原本说要问45分钟,结果只聊了30分钟。
希望下次能有更好的体验!

题目:两个数组的交集

给你两个整数数组 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
解法一:排序 + 双指针
思路
排序:
首先对两个数组进行排序。这会使得相同的元素相邻,从而方便后续查找。
双指针遍历:
使用两个指针 i 和 j,分别指向两个数组的起始位置。比较两个指针指向的元素:
如果 nums1[i] 小于 nums2[j],则移动指针 i 向后。
如果 nums1[i] 大于 nums2[j],则移动指针 j 向后。
如果两个元素相等,说明找到了交集,将这个元素加入结果数组,并同时移动两个指针。
优点
时间复杂度:O(n log n + m log m),其中 n 和 m 分别是两个数组的长度,因为需要对两个数组进行排序。查找交集的过程是 O(n + m)。
空间复杂度:O(1),除了结果数组,未使用额外的存储空间。
func intersect(nums1 []int, nums2 []int) []int {
sort.Ints(nums1)
sort.Ints(nums2)

result := []int{}
i, j := 0, 0

// 双指针遍历两个数组
for i < len(nums1) && j < len(nums2) {
   if nums1[i] < nums2[j] {
      i++
   } else if nums1[i] > nums2[j] {
      j++
   } else {
      result = append(result, nums1[i])
      i++
      j++
   }
}
return result

}

func main() {
fmt.Println(intersect([]int{1, 2, 2, 1}, []int{2, 2})) // 输出: [2, 2]
fmt.Println(intersect([]int{4, 9, 5}, []int{9, 4, 9, 8, 4})) // 输出: [4, 9]
}

解法二:使用哈希映射
思路
统计出现次数::
首先,我们遍历第一个数组 nums1,使用一个哈希映射(字典)来统计每个元素出现的次数。
哈希映射的键是数组中的元素,值是该元素的出现次数。
查找交集:
接下来,我们遍历第二个数组 nums2。
对于 nums2 中的每个元素,检查它是否在哈希映射中存在且出现次数大于 0。
如果存在,将该元素加入结果数组,并将其在哈希映射中的计数减 1(因为我们已经找到了一个交集,需减少对应的计数)。
优点
时间复杂度:O(n log n + m log m),其中 n 和 m 分别是两个数组的长度,因为需要对两个数组进行排序。查找交集的过程是 O(n + m)。
空间复杂度:O(1),除了结果数组,未使用额外的存储空间。
/*
*使用哈希映射
通过哈希映射记录每个元素的出现次数,然后遍历第二个数组,找到交集。
*/
func intersect(nums1 []int, nums2 []int) []int {
countMap := make(map[int]int)
result := []int{}

// 记录 nums1 中每个元素的出现次数
for _, num := range nums1 {
   countMap[num]++
}

// 遍历 nums2,找到交集并更新计数
for _, num := range nums2 {
   if count, ok := countMap[num]; ok && count > 0 {
      result = append(result, num)
      countMap[num]-- // 减少出现次数
   }
}
return result

}

leetcode:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2y0c2/
牛客网:https://www.nowcoder.com/discuss/353159605356273664?sourceSSR=search

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/422587.html

(0)
联系我们
联系我们
分享本页
返回顶部