通过路由,交换,安全,Qos四大典型技术模块同你分享网络运维中的技术难题,让老司机带你躲过网络运维常见的那些坑, 查看详情>>>
0

我的帖子

个人中心

设置

  发新话题
看到其他部门的笔试题,发现有这个题目:两个有序数组的合并,于是尝试着用python写出来
关键:
1、两个数组已经排序好,所以内部无需比较,比较都是存在于两个数组之间
2、比较结束后,需要将其中一个数组的剩余序列添加到最终的数组
复制内容到剪贴板
代码:
if __name__ == '__main__':
    a=[2,4,6,8,9,10]
    b=[0,1,3,6,7,9,100,134]
    counta=countb=0#分别记录两个数组遍历到哪个位置了

    c=[]
    for i in range(counta,len(a)):
        for j in range(countb,len(b)):
            print "b[j]:",j,b[j]
            if(b[j]<=a):
                c.append(b[j])
                countb=countb+1#append了b[j],那么b数组的遍历的记录应该自增
            else:
                c.append(a)
                counta=counta+1#append了a,那么a数组的遍历的记录应该自增
                break#为啥要break?因为到此位置,说明b数组不能继续往下遍历了,该遍历a了

    #现在就需要吧两个数组中剩余的元素依次append到c中即可
    if (counta<len(a)):
        for i in range(counta,len(a)):
            c.append(a)
    if (countb<len(b)):
        for j in range(countb,len(b)):
            c.append(b[j])
    print c



本帖最后由 hh2o 于 2014-12-12 14:30 编辑
很好的例子 受教了



因为后面得到的也是一个有序数组,看可以不可以这么操作:
1.合并两个数组,
2.对合并后的数组.sort()
这样就可以得到最终的合并的数组了

以上纯属菜鸟个人看法,请各位大牛指教



引用:
原帖由 qinzaoxiaozhu 于 2014-12-19 09:58 发表
因为后面得到的也是一个有序数组,看可以不可以这么操作:
1.合并两个数组,
2.对合并后的数组.sort()
这样就可以得到最终的合并的数组了

以上纯属菜鸟个人看法,请各位大牛指教 ...
e,你这个是可以的。但是我们就是要实现这个算法,要把这个算法的具体细节写出来。。



引用:
原帖由 hh2o 于 2014-12-19 14:19 发表

e,你这个是可以的。但是我们就是要实现这个算法,要把这个算法的具体细节写出来。。
明白了。多谢。



很标准的归并操作嘛
@qinzaoxiaozhu 的法子,耗时就上去了,不如直接用楼主的归并~~



用递归实现

a = [2,4,6,7,11,14]
b = [0,5,7,9,10,12,13,21,33,36,44]
c =[]

def jarr(a,b,m,n):

ai,bi = m, n

print("a[%s]:%s, b[%s]:%s" % (m,a[m],n,b[n]))

if a[m] < b[n]:

c.append(a[m])

ai=ai+1

if ai <len(a):

jarr(a,b,ai,bi)

else:

c.extend(b[bi:])

else:

c.append(b[n])

bi=bi+1

if bi <len(b):

jarr(a,b,ai,bi)

else:

c.extend(a[ai:])

if __name__ == '__main__':

jarr(a,b,0,0)

print(c)



用递归的方法
复制内容到剪贴板
代码:
a = [2,4,6,7,11,14]
b = [0,5,7,9,10,12,13,21,33,36,44]
c =[]

def jarr(a,b,m,n):
        ai,bi = m, n
        print("a[%s]:%s, b[%s]:%s" % (m,a[m],n,b[n]))
        if a[m] < b[n]:
                c.append(a[m])
                ai=ai+1
                if ai <len(a):
                        jarr(a,b,ai,bi)
                else:
                        c.extend(b[bi:])
        else:
                c.append(b[n])
                bi=bi+1
                if bi <len(b):
                        jarr(a,b,ai,bi)
                else:
                        c.extend(a[ai:])

if __name__ == '__main__':
        jarr(a,b,0,0)
        print(c)



谢谢老铁,但是代码有错,同时应该去重的



楼主,能够这样做么
# coding: utf-8

a = [2, 4, 6, 8, 9, 10]
b = [0, 1, 3, 6, 7, 9, 100, 134]
c = []
while True:
    if len(a) <= 0:
        c.extend(b)
        break
    if len(b) <= 0:
        c.extend(a)
        break
    if a[0] >= b[0]:
         c.append(b[0])
         b.remove(b[0])
    else:
        c.append(a[0])
        a.remove(a[0])
print(c)



引用:
原帖由 popwbob 于 2015-10-9 21:46 发表
用递归的方法

a = [2,4,6,7,11,14]
b = [0,5,7,9,10,12,13,21,33,36,44]
c =[]

def jarr(a,b,m,n):
ai,bi = m, n
print("a[%s]:%s, b[%s]:%s" % (m,a[m],n,b[n]))
if a[m] < b[n]:
c.append(a[m])
ai=ai+1
...
这个递归,我头都看大了



‹‹ 上一贴:手把手|20行Python代码教你批量将PDF文件转为Word格式 ...   |   下一贴:3行Python代码完成人脸识别 ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2018 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com