您的位置:首页 > 编程语言

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

2016-04-04 19:54 239 查看
<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 mat

import pprint
pprint.pprint(snake(7))</span>


运行结果如下:



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

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

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

<span style="font-size:14px;">############################################ 算法导论-动态规划子序列2 2016.4.3

def 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>
结果如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: