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>
结果如下图所示:
相关文章推荐
- 关于C语言的问卷调查
- Springmvc框架配置和详情
- Qt和Qt creator、Kdevelop的关系
- Java NIO框架Netty教程(一) – Hello Netty
- Java学习之---Throwable类浅谈
- Java进阶01 String类
- C++实现简单的计时器
- Java中Dao模式中两种Dao的数据库操作(BaseDao的写法)
- 使用token防止表单重复提交
- php统计字符串最大回文数问题
- javase笔记16.4.4
- Java的访问权限修饰符public、默认(包访问权限)、protected、private
- Java使用servlet+freemarker渲染html视图
- Numpy库进阶教程(二)
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
- 【day0404】C++ 局部对象
- java 关于多态的一点总结
- Java抽象类与接口的区别
- 基于Spring + Spring MVC + Mybatis 高性能web构建
- SpringMVC学习记录(三)--异常处理