2016.4.3 腾讯实习生笔试编程题解

来源:互联网 发布:php 跨域 header 编辑:程序博客网 时间:2024/06/06 12:22
<span style="font-size:14px;">############################################ 打印蛇形矩阵 2016.4.3# 2016.4.3 腾讯笔试题编程1(稍微耐心点就行)def snake(n):    mat = [[0]*n for i in range(n)]    w,s,a,d = 0,n,0,n    num = 0    flag = 'left'    while num<n*n:        if flag=='left':            for i in range(a,d):                num += 1                mat[w][i] = num            w += 1            flag = 'down'        elif flag=='down':            for i in range(w,s):                num += 1                mat[i][d-1] = num            d -= 1            flag = 'right'        elif flag=='right':            for i in range(d-1,a-1,-1):                num += 1                mat[s-1][i] = num            s -= 1            flag = 'up'        elif flag=='up':            for i in range(s-1,w-1,-1):                num += 1                mat[i][a] = num            a += 1            flag = 'left'    return matimport pprintpprint.pprint(snake(7))</span>


运行结果如下:



第一题:打印蛇形矩阵(如上)

第二题:求字符串中的最长回文串

本质还是最长公共子序列问题,将原串与反转串求LCS即得解

<span style="font-size:14px;">############################################ 算法导论-动态规划子序列2 2016.4.3def max_sublist(A,B):    nA,nB = len(A),len(B)    c = [[0]*(nB+1) for i in range(nA+1)] # 注意c要多留一列    flag = [['']*nB for i in range(nA)]    for i in range(nA):        for j in range(nB):             if A[i]==B[j]: # c[i+1][j+1] 对应于 flag[i][j]                c[i+1][j+1] = c[i][j] + 1                flag[i][j] = 'zs' # ↖左上方向            else:                if c[i][j+1] > c[i+1][j]:                    flag[i][j] = 's' # 上方向                    c[i+1][j+1] = c[i][j+1]                else:                    flag[i][j] = 'z' # 左方向                    c[i+1][j+1] = c[i+1][j]    return flag, c[i+1][j+1]# flag 指明了从后往前查找的方向def print_max_sublist(flag, A, i=None, j=None):    i=len(flag)-1 if not i else i    j=len(flag[0])-1 if not j else j    res = ''    while i>=0 and j>=0:        if flag[i][j]=='zs':            res = A[i] + res            i-= 1            j-= 1        elif flag[i][j]=='z':            j -= 1        else:            i -= 1        return res               def test_max_sublist():    A = 'ACCGGTCGAGTGCGCGGAAGCCGGCCGAA' # +'ABCWDADDACAWDADAWDWDWDASDADSDAS'    B = 'GTCGTTCGGAATGCCGTTGCTCTGTAAA' # +'ABCWDADDFEDADAWDWCAWDASDADSDAS'    flag, c = max_sublist(A, B)    res = print_max_sublist(flag, A)    print A,'\n',B    print 'max subsequence length:', c    print 'max subsequence:\n', res    test_max_sublist() # memo的空间过大,实际上还可以压缩 </span>

结果如下图所示:








0 0
原创粉丝点击