剑指offer-面试题4-(举一反三)-刷题及总结(python)

题目:有两个排序的数组A1和A2。内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的。

解题思路

这道题是面试题4-替换空格的相关题目,和那道例题一样,首先想到的可能是在A1中从头到尾复制数字,但这样就会出现多次复制一个数字的情况,更好的办法是从尾到头比较A1和A2中的数字,并把较大的数字复制到A1的合适位置。这道题是举一反三,书中没有给具体答案,我自己是这样解题的:先计算A1数组的新长度,计算公式是:A1原长度+A2原长度-重复元素个数,因为重复元素只需保留一个;然后P3指针指向A1新长度末尾,这里会插入较大数字,P1指针指向A1原长度末尾,P2指针指向A2末尾,然后比较P1和P2所指元素大小,将较大的数字插入P3所指位置,P3向前一位,数字较大的指针向前一位,特殊情况是P1所指=P2所指,此时只需插入P1所指,P3向前一位,然后P1和P2同时向前一位。由于是将A2插入到A1中,循环判断条件是P2<0。用这样的思路实现代码,输入几组数据,验证想法正确,特殊测试用例是空数组和有重复元素的数组。

代码实现(python)

def merge_array(A1,A2,A1_length):
    if A1 == None or A2 == None:
        return
    #计算两个数组重复的个数
    num = 0
    for a in A1:
        if a in A2:
            num += 1
    #计算新的长度
    new_length = A1_length + len(A2) - num
    index_p1 = A1_length - 1
    index_p2 = len(A2) - 1
    index_p3 = new_length - 1
    #由于是将A2中元素插入到A1中,这里判断A2为循环结束条件
    while index_p2 >= 0:
        if A2[index_p2] > A1[index_p1]:
            A1[index_p3] = A2[index_p2]
            index_p2 -= 1
        elif A2[index_p2] < A1[index_p1]:
            A1[index_p3] = A1[index_p1]
            index_p1 -= 1
        else:
            A1[index_p3] = A1[index_p1]
            index_p2 -= 1
            index_p1 -= 1
        index_p3 -= 1


if __name__ == "__main__":
    A2 = [1,5,6,7,10]
    A1 = list(['' for x in range(0, 50)])
    i = 0
    for n in [1,3,4,7,9]:
        A1[i] = n
        i += 1
    print(A1)
    merge_array(A1,A2,len([3,5,6,7,8]))
    print(A1)

解题总结

1.只要是向数组或字符串中插入元素多次,就要考虑从后往前插入,这样可以避免多次移动重复元素,提前预留足够位置,并且要提前计算好新的长度。这个总结和前一道题是一样的。
2.循环判断条件也非常重要,开始解题时,我设置判断条件为index_p2>0,没有考虑到当p2=0的时候,还要继续判断,这种边界值一定要考虑到。
3.入参如果是数组,要判空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值