• 有序数组合并


    算法题其实不要慌就行了,就是太久没做了。

    题:有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)
  • 相关阅读:
    IfcDescriptiveMeasure
    IfcBooleanOperator
    IfcKnotType
    IfcCurveOnSurface
    IfcCurvatureMeasure
    IfcBSplineCurveForm
    IfcDoseEquivalentMeasure
    netty系列之:使用UDP协议
    netty系列之:自定义编码和解码器要注意的问题
    netty系列之:内置的Frame detection
  • 原文地址:https://www.cnblogs.com/lurenjia1994/p/10575598.html
Copyright © 2020-2023  润新知