谷歌公司曾经面试的算法题:合并两个排好序的数组

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


谷歌公司面试题:合并两个排好序的数组,合并为一个排好序的数组,请问你可以用几种方法,哪种方法好,并且为什么?

方法1:双指针法

算法描述:

  1. 定义两个指针 i 和 j,分别指向两个输入数组的起始位置。

  2. 创建一个空数组 merged_arr 用于存储合并后的有序数组。

  3. 在循环中,比较两个指针所指向的元素,将较小的元素添加到 merged_arr 中,并将指针向后移动一位。

  4. 重复这个过程,直到其中一个指针超出了其数组的长度。

  5. 将另一个数组中剩余的元素依次添加到 merged_arr 的末尾。

  6. 返回合并后的有序数组 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. 我们假设第一个数组(数组1)的长度为 m,第二个数组(数组2)的长度为 n。

  2. 我们扩展数组1的长度,使其能够容纳数组2的所有元素,并确保有足够的空间来容纳合并后的结果。

  3. 我们使用两个指针 i 和 j 分别指向数组1和数组2的开头。

  4. 我们从数组2中取出每个元素,依次将其插入到数组1中的适当位置,保持数组1的有序性。

  5. 插入过程中,我们移动数组1中的元素以便为新元素腾出位置。

  6. 最后,合并后的结果就是扩展后的数组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%免费】
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值