2010年浙大Google宣讲会+面试题

昨天参加了google宣讲会,人爆满啊!宣讲会后,是笔试时间90分钟。题目包括:10道选择题--Hr说你只有做对5道题才可以进行以下的面试,貌似我做得很惨(自己没怎么准备面试的知识,汗一下)。不管了,自我感觉后面的三道问答题做得不错。总体感觉题目出的很灵活,呵呵!

选择题包括:排序方面的题挺多的,linux方面就一道选择题。

问答题记得很清楚:

(1)有两个整数数组A和B,大小分别是m,n。求这两个数组的交集。

       这道题不是很难。时间复杂度最大的是O(m*n),这个方法就只是简单的循环判断。自我感觉比较好的方法是,先使用排序方法对A和B数组进行排序,然后再就交集。

(2)银行有四个柜台,某天有200位顾客来银行办理业务,到达银行的时间和开始处理业务的时间分别被存到arrive_time和process_time两个数组里。每个顾客进银行时是拿号的,然后哪个柜台是空闲的,号最靠前的顾客就可以去办理业务,其他的时间忽略不计。

        我自己写的方法是:将process_time时间总和去减arrive_time时间总和,得到是时间就是客户的等待的时间。不知是不是正确。希望大家提意见。

(3)有数值范围在0~N^2-1之间的n个整数,进行排序。优先考虑时间复杂度优化,再考虑空间复杂度。请写出时间复杂度和空间复杂度。

        自己的方法:大体思路类似于基数排序。首先先将n个数组存储到A数组,然后再声明2个大小都是n的数组B和C(用于存储进行按位“与”计算的结果)。B数组用于存储按位“与”后结果是1的数据,否则存到C数组。

        int j=0,k=0;

        for(int i=0;i<n;i++){                 //对第一个位数按位与

                  if(A[i]&1==0){

                          C[j++]=A[i];

                  }else{

                           B[k++]=A[i];

                  }

        }

        //将B和C数组进行合并到A,B先放到A中,然后是C,这样数组最终结果会是从大到小排序

        for(i=0;i<k;i++){

               A[i]=B[i];

        }

        for(k=0;k<j;k++){

               A[i++]=C[k];

        }

        下面的步骤会和以上差不多,唯一的区别在于:是按照第二个位“与”,也就是,上面的“1”数字改为“2”(在计算机中存储是010)。再下次就变成“4”(计算机存储是0100)。最终需要log2(N^2)次循环。

         到此大家能理解我的解题思路了吧!

        时间复杂度是:O(2n×log2(N^2))=》O(nlogN)。

        空间复杂度是:O(3n)=》O(n)

 

        呵呵希望大家指导,一起进步!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值