替换空格
题目:有两个排序的数组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.入参如果是数组,要判空