1、一棵树,求它的一条最大路径(边的长度),不必过根结点
public int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
getMaxSum(root);
return maxSum;
}
public int getMaxSum(TreeNode root){
if(root == null) return 0;
int leftPath = 0;
int rightPath = 0;
int tempRes = root.val;
if(root.left != null){
leftPath = getMaxSum(root.left);
if(leftPath > 0){
tempRes += leftPath;
}
}
if(root.right != null){
rightPath = getMaxSum(root.right);
if(rightPath > 0){
tempRes += rightPath;
}
}
if(maxSum < tempRes){
maxSum = tempRes;
}
return Math.max(root.val,root.val +Math.max(leftPath,rightPath));
}
2、二分查找,有重复元素,递归和非递归
public int binarySearchNoRecInt(int[] a, inttarget){
int aLength = a.length;
if(aLength == 0) return -1;
int low = 0;
int high = aLength;
//左闭右开型
while(low+1 != high){
int mid = low +((high -low) >> 1);
if(a[mid] < target){
low= mid;
}else{
high= mid;
}
}
if(a[high] == target) return high;
return -1;
}
3、简化linux中的路径
public String simplifyPath(String path) {
//用于模拟压入
Stack<String> s = new Stack<String>();
String str = "";
for(int i = 0; i < path.length(); i++){
//如果当前字符是 /
if (path.substring(i, i+1).equals("/")){
//判断前面的字符 如果是../那么就往外弹出一层
if(str.equals("..")){
//弹出
if (!s.empty())
s.pop();
//如果是./或者是空,那么直接跳过就可以
}else if (!str.equals(".") && !str.equals("")){
s.push(str);
}
str = "";
}else{
//str用于记录当前不是/的时候的数值
str += path.substring(i,i+1);
}
}
//如果最后一个是.. 那么还是弹出一个
if (str.equals("..")){
if (!s.empty())
s.pop();
//否则加入到栈中
}else if (!str.equals(".") && !str.equals("")){
s.push(str);
}
//如果栈为空,那么就直接返回
if (s.empty())
return "/";
String ret = "";
while(!s.empty()){
ret = "/" + s.peek() + ret;
s.pop();
}
return ret;
}
4、圆上任意两条线段不相交的概率
5、二叉树后序 非递归
publicList<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
if(root == null) return result;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pre = null;
TreeNode cur = null;
stack.push(root);
while(!stack.isEmpty()){
cur = stack.peek();
if((cur.left == null && cur.right == null) || (pre != null&& (pre == cur.left || pre == cur.right))){
result.add(cur.val);
stack.pop();
pre = cur;
continue;
}
if(cur.right != null){
stack.push(cur.right);
}
if(cur.left != null){
stack.push(cur.left);
}
}
return result;
}
6、 Linux 进程间通信方式,优缺点
信号量:进程间同步的时候经常用。
信号:机制复杂
共享内存
套接字通信
消息队列
管道
7、 A、B个文件各50亿url,内存1G,求url交集
方法一:50亿byte 就是5G。所以不能完全读入内存。那么可以采用分而治之的方式,遍历文件A,然后对于每一个url进行hash操作,然后存入到对应的文件中。对B同样的操作,然后分解在操作对应的文件中的数据。如a0和b0,找到交集即可。
方法二:可以借助数据库来实现,先将一个文件中的数据存入到数据库,另外一个文件中的数据插入时如果报错,说明重复。
http://www.kuqin.com/job/20120324/319274.html
【1KB = 1024Byte】
(1)分而治之/Hash映射+Hash统计+排序(堆排序,快速排序,归并排序)
先将原来的大文件通过分而治之的方式分成很多小文件,然后对小文件里面的内容通过Hash快速的统计出此处;然后汇总结果,找出全局结果。
(2)双层桶思想
其实就是对于大数据先进行一步划分,然后对于划分出的结果再进行一次划分。
整数范围是0 - 2^32 - 1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M= 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段
双层桶在划分的时候更加专业一些,更加精确和理论一些,每一个范围内都会有什么数字都是可以列出范围的。
(3)还可以通过数据库来实现
(4)bitmap就是可以通过位来标识一个数据的情况。
8、矩阵有0(不可通过)和1(可通过),求src到dst的最小步数
9、用户搜索李娜,怎样判断是 网球运动员李娜还是歌手李娜?怎样判断百科词条中的李娜链接到底指向的是哪个李娜?
10、对加班怎么看
11、对BAT各有什么看法
http://www.tmtpost.com/55921.html
阿里巴巴是一张网,百度是一条线,腾讯是一个中心多个点。
阿里公司在电子商务这一块无疑是业界的老大,而且阿里的经营策略就是整合,注重信息流,物流以及支付流的整合。希望改变传统的交易模式。
此时此刻,非你莫属!团队合作精神,面向服务的思想。
CEO:陆兆禧
1999年创立。天猫:B2C,淘宝:C2C。
客户第一,员工第二,股东第三。
百度比较稳重,沿着搜索引擎这条路走,主要就是抓住流量,希望能够留住用户。一般对于影响其流量的公司,基本都是控股或者直接收购。比较走技术路线,希望保持在某一方面的绝对优势。
2000年成立,李彦宏与徐勇共同开创。百度熊吉祥物,熊爪。2005年美国纳斯达克上市;2009年推出框计算概念;随着互联网向移动端的转型,百度也开始想云计算和移动领域拓展。
李明远设计百度贴吧。孙云丰参与百度很多核心产品的决策和设计。
腾讯就是比较全面,依托QQ这个大门,提供全方位的服务。虽然被冠以抄袭大王,但是腾讯的创新还是非常好的。腾讯是以产品作为王道。能自己做的从来不去收购。
1998年成立。
愿景:最受欢迎的互联网企业,通过互联网提升人类生活品质。
12、对工作地有什么要求? 对以后工作有什么规划?
13、求数组中最小的连续子串和
public intmaxSubArray(int[] A) {
int aLength = A.length;
if(aLength == 0) return 0;
int ret = Integer.MIN_VALUE;
int tempSum = 0;
for(int i = 0; i < aLength; i++){
tempSum += A[i];
if(ret < tempSum){
ret = tempSum;
}
if(tempSum < 0){
tempSum = 0;
}
}
return ret;
}
public int minSubArray(int[] A){
int ret = Integer.MAX_VALUE;
int temp = 0;
int aLength = A.length;
for(int i = 0; i < aLength;i++){
temp+= A[i];
if(ret > temp){
ret= temp;
}
if(temp > 0){
temp= 0;
}
}
return ret;
}
14、用正则表达式写一个grep命令
15、sort,uniq,awk等命令
16、TCP三次握手和四次挥手过程,如果不三次握手和四次挥手会出现什么问题
三次握手:
客户端: Seq = XSyn = 1
服务器端: Seq =Y SYN = 1 ACK = x+1
客户端: ACK =y+1 SEQ = Z
四次挥手:
客户端: FIN = 1;SEQ = x; ack = z;
服务器端:seq = z,ACK = 1 + x
服务器端;FIN =1 ;ACK = x, SEQ = y
客户端:seq = x,ack = y
为什么三次:比如客户端先让a去给服务器端送信,结果a半途休息给耽误了,那么客户端有派b去给服务器端送信,b顺利的连接了客户端和服务器端。这个时候a休息好了,也到了服务器端,服务器端以为又要建立连接,于是又建立了一个连接,时刻等待客户端数据的到来。然后a的反馈信息到了客户端的时候,客户端已经不理睬了。就相当于坑骗了服务器端,浪费服务器端的资源。
为什么四次?客户端想断开连接的时候,服务器端不一定统一断开,可能等完事之后,服务器端再发送断开请求,那么确定后就可以关闭了。
17、进程通信的方式,异步和同步的区别
共享内存,信号,信号量,消息队列,管道,套接字
同步就是one byeone,一个一个来,有顺序;异步就是另外一件事干着的同时不会影响当前做着的事情。
同步就像面试官问问题,一个一个来,上一个结束,下一个开始;异步就好比你有个小秘书,你让小秘书记录,我们在这对话,他记录不记录不影响你现在问我问题。
18、进程和线程有哪些相同点,不是不同点
进程是系统进行资源分配和调度的基本单位,线程是CPU调度和分配的单位。进程可以包含多个线程,进程中有一个主线程,多线程共享同一块内存。
相同点:两者都有ID,都有一组寄存器,状态,优先级以及所要遵循的调度策略。进程有进程控制块,线程也有线程控制块。线程和子进程都可以访问父进程的资源,线程和自己称的创建者都可以对线程和子进程进行处理。
19、用PV操作实现生产者消费者问题
进程间互斥的时候经常用到这个。P代表-,V代表+,当进程进去临界区的时候,它先执行P原语操作以将信号量-1,进程完成对临界区操作后,然后操作v,信号量+1。
20、100亿个整形数据的文件,统计出现重复3次以上的数据个数
100亿个整数,分到128M个文件中,那么每个文件的数字范围区间是32。那么每一个区间中的数字个数是80个左右,那么完全可以统计出出现次数为3次以上的数字个数。或者借助两位标记为来做:0001 10 11,然后需要25亿Byte,大概是2.5G大小的空间。
21、设计一个栈结构,求栈的中位数
22、环形的0,1串,求最长公共子串。
http://blog.csdn.net/steven30832/article/details/8260189
解题思路非常的清晰:首先考虑的是有个m*n的矩阵,然后如果相等的,那么a[m][n]=1,那么在矩阵中斜着的1最长的就是最长的公共子串。求最长的的1斜着的长度还是非常麻烦的。优化一下就是如果两个字符相等的时候,判断他们的左上角的是几,如果是1,那么就类加上就可以了,这样就能知道最大值是多少;为了节约空间,可以只用一个数组来做,然后不断从右向左刷新数组,计算的过程中找到最长的长度和位置,就可以得到最后的结果。
最大子段和:经常做的那种 和<0的时候就从头再开始
最长递增子序列:通过一个数组来表示每一个位置前面的最长递增子序列。如j位置,那么我们可以遍历0-j的所有元素,如果小于j元素的,那么j处的数值就可以是前面的那个元素数值+1里面的最大值。这样最后遍历这个数组就可以找到结果了。
最长公共子序列:也是通过矩阵来实现,i和j的矩阵数值,等于三处的最大值,上面,左面和左上角(如果当前相等,那么就是左上角+1)
http://www.cnblogs.com/zhangchaoyang/articles/2012070.html
编辑距离:
arr[i][j]=min{1+arr[i][j-1],1+arr[i-1][j], 1+arr[i-1][j-1](当S1[i]!=S2[j]), arr[i-1][j-1](当S1[i]==S2[j])}
边界情况:arr[0][j]=j,arr[i][0]=i
24、100台机器,每个机器1000万个文件,每个文件有1000URL, 给定一个URL,返回这个URL出现的次数,支持在线查询
25、Baidu搜索中,比如输入刘德h,会返回李德华的信息,怎么做呢?
26、www中,有很多page是相似的,给定一个page,你怎么找出它的相似page呢?
27 一个文本文件随机抽样若干行,写代码