百度-互联网面试题

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 进程间通信方式,优缺点

信号量:进程间同步的时候经常用。

信号:机制复杂

共享内存

套接字通信

消息队列

管道

http://zhidao.baidu.com/link?url=97pkTcBV92iBjwS5koQN6Mo1RSQWX3GkKpYME3CpVcTOIVqWaHEG_fYCVzp9RygvgrDgKJZ06vCfxfvLY7TVMq


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个区段,则每个区段有164G/256M= 16)种值,每16个值算一段, 015是第1段,1631是第2段,……2^32-16 2^32-1是第256M

        双层桶在划分的时候更加专业一些,更加精确和理论一些,每一个范围内都会有什么数字都是可以列出范围的。

3)还可以通过数据库来实现

(4)bitmap就是可以通过位来标识一个数据的情况。


8、矩阵有0(不可通过)1(可通过),求srcdst的最小步数

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 一个文本文件随机抽样若干行,写代码



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值