算法题其实不要慌就行了,就是太久没做了。
题:有3个数组从小到大,写一段代码合并成一个数组,并保证顺序
大致思路:
1. 拆成两个数组合并 2. 构造一个新数组,为的是不影响原数组,而且修改数组比插入数字消耗少 3. 因为源数组本身有序,所以可根据顺序,减少运算次数 4. 结果数组弄个游标,初始为0,记录操作位置,从两个数组取出值比较,小的数加入到结果数组,再从小的数这个数组再取数比较,直到大于另外一个数组的数,时间复杂度为O(n)
代码:
# encoding='utf8' def list_merge(list_a, list_b): '''返回两个数组合并的结果''' len_a = len(list_a) len_b = len(list_b) result = [None for i in range(len_a + len_b)] # 构造返回数组 cursor_r = -1 # result游标 cursor_b = 0 # list_b游标 # 依次从数组的最前面取出最小的数,更新到结果数组 for item_a in list_a: for idx in range(cursor_b, len_b): cursor_r += 1 # 移动游标 item_b = list_b[idx] if item_a > item_b: result[cursor_r] = item_b cursor_b += 1 # 移动list_b的游标 else: result[cursor_r] = item_a # 因为list_a是for循环遍历,所以不需要游标 break # 继续从list_a取数 # 因为是采用两两比较,放入最小的数,所以会导致丢失最大的数,这里加入最大数 last = max(a[-1], b[-1]) result[-1] = last return result if __name__ == '__main__': a = [1, 2, 3, 4, 5] b = [2, 3, 4, 6] c = list_merge(a, b) print(a,b) print(c)