昨天参加了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)
呵呵希望大家指导,一起进步!