2011-6-24 笔试题讨论

来源:互联网 发布:video.js支持视频格式 编辑:程序博客网 时间:2024/05/16 14:10

本周主题,分享it面试和笔试题,现收录如下:

1、给定一个整数数组,求三个数之和的绝对值最小?

首先对数组排序,复杂度为nlgn。然后从1……n每次选取一个数,这里是n个复杂度。每次选取一个数后,再从数组的begin、end开始,相向移动。如果三者之和小于零,则begin++,若大于零,则end--,移动到绝对值不能再小为止。更新min值。这里需要遍历一遍数组,复杂度也为n。因此最后的复杂度为n平方。

提示:遇到此类数组求和问题,求差问题,通常先排序。

 

2、求最大凌乱子矩阵?

有矩阵a[m][n],矩阵内只有0和1,凌乱矩阵定义为正斜方向和反斜方向全为0,或全为1,要求求出一个给定矩阵a[m][n],其最大凌乱子矩阵是多大?

用DP思想可解,时间复杂度为o(n2).

维护一个矩阵k[m][n],令k[i][j]为以a[i][j]为右下角的凌乱矩阵的大小。则有状态转移方程:

k[i][j]= 1, 如果左上值、上值、左值不满足凌乱,则为1;

=min{k[i-1][j-1], k[i-1][j], k[i][j-1]},如果左上值、上值、左值(以a[i][j]为右下角边长为2的矩阵)满足凌乱。

矩阵k[m][n]初始化时,第一行和第一列值均为1。依次求出所有的解,矩阵内最大值则为最大凌乱子矩阵。

 

3、循环有序数组的查找问题?

在一个循环有序的数组里查找特定值。(循环有序就是指数组里的各项都是有序的,但是最小值不一定是数组的第 0 项,而可能是其中任意一项,然后逐项递增,到数组尾的时候再回到第 0 项),如3……81……2

解法:仍用二分查找法,需要考虑最小值的位置,时间复杂度为o(lgn),参考http://blog.csdn.net/aixiaolin/archive/2011/05/10/6408679.aspx

 

4、最大子段和

DP思想,o(n)

 

5、找出出现次数最小的单词

可用hash

 

6、堆排序(阿里云笔试题)

堆排序包括堆初始化、堆调整两部分。堆初始化需要从倒数第二层开始进行堆调整,直到堆顶;以后的堆调整只需要调整堆顶。

 

7、动态创建一个三维数组并初始化为0

 

8、用有限自动机表示正则表达式

 

9、求两单链表是否相交、是否带环、环长度、链表长度、连接点位置

 

10、linux命令行

根据端口号查找占用的进程号

awk、grep用法

 

11、字符串的编辑距离

 

12、一组整数,按何种顺序连接,使得连接后的数值最小?

将整数按照最高位排序后连接起来的数最小。如123、98、67,按照最高位排序后得到1236798,该数最小。

因为排序后的连接数,交换两数位置后,其值总是变小。

 

13、最大生成子序列LS

 

14、字典树trie tree和PAT tree

 

15、约瑟夫算法