📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
谷歌公司面试题:合并两个排好序的数组,合并为一个排好序的数组,请问你可以用几种方法,哪种方法好,并且为什么?
方法1:双指针法
算法描述:
-
定义两个指针 i 和 j,分别指向两个输入数组的起始位置。
-
创建一个空数组 merged_arr 用于存储合并后的有序数组。
-
在循环中,比较两个指针所指向的元素,将较小的元素添加到 merged_arr 中,并将指针向后移动一位。
-
重复这个过程,直到其中一个指针超出了其数组的长度。
-
将另一个数组中剩余的元素依次添加到 merged_arr 的末尾。
-
返回合并后的有序数组 merged_arr。
def merge_sorted_arrays(arr1, arr2):
merged_arr = []
i = j = 0
while i < len(arr1) and j < len(arr2):
if arr1[i] < arr2[j]:
merged_arr.append(arr1[i])
i += 1
else:
merged_arr.append(arr2[j])
j += 1
merged_arr.extend(arr1[i:])
merged_arr.extend(arr2[j:])
return merged_arr
方法2:使用插入排序的思想
算法思想如下:
-
我们假设第一个数组(数组1)的长度为 m,第二个数组(数组2)的长度为 n。
-
我们扩展数组1的长度,使其能够容纳数组2的所有元素,并确保有足够的空间来容纳合并后的结果。
-
我们使用两个指针 i 和 j 分别指向数组1和数组2的开头。
-
我们从数组2中取出每个元素,依次将其插入到数组1中的适当位置,保持数组1的有序性。
-
插入过程中,我们移动数组1中的元素以便为新元素腾出位置。
-
最后,合并后的结果就是扩展后的数组1。
def merge_sorted_arrays(arr1, arr2):
m, n = len(arr1), len(arr2)
arr1.extend([float('inf')] * n) # 扩展数组1的长度,确保有足够的空间
i = j = 0
while j < n:
if arr2[j] < arr1[i]:
k = m + j
while k > i:
arr1[k] = arr1[k - 1]
k -= 1
arr1[i] = arr2[j]
j += 1
i += 1
return arr1
最佳方法的选择:
大多数情况下,双指针合并是最佳的选择。它具有较低的时间和空间复杂度。它的时间复杂度为 O(m + n),其中 m 和 n 分别是两个输入数组的长度。而空间复杂度仅为 O(m + n)。因此,它在大多数情况下是最有效的。
使用插入排序的思想的时间复杂度同样为 O(n^2),因此在实践中可能不如方法一高效。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】


1906

被折叠的 条评论
为什么被折叠?



