当n=11时,输出:
()
a、12b、13c、14d、15
5、写一段程序判定一个有向图G中节点w是否从节点v可达。
(假如G中存在一条从v至w的路径就说节点w是从v可达的)。
以下算法是用C写成的,在boolReachable函数中,你可以写出自己的算法。
classGraph{
public:
intNumberOfNodes();//返回节点的总数
boolHasEdge(intu,intv);//u,v是节点个数,从零开始依次递增,当有一条从u到v的边时,返回true
};
boolReachable(Graph&G,intv,intw){
//请写入你的算法
}
6、给定一棵所有边的长度均为整数的树,现要求延长其中某些边,使得从根到任意节点的路径长度相等。
问满足要求的树的边长度之和最小是多少?
请写出你的算法,并分析时间复杂度。
=====================================================================
Google笔试题
1、两个二进制数的异或结果
%L.P2C5_ ]2、递归函数最终会结束,那么这个函数一定(不定项选择):
7R8c7y(Q+g/a"O1. 使用了局部变量
;s2S8]9M;w&^.{3d2.有一个分支不调用自身
&J2D7Z+`$a4R"A4c3. 使用了全局变量或者使用了一个或多个参数,O-l+f3i8v*a$m
S0d,~'B,\,{*L
3、以下函数的结果?
2^*s;z/O$a$z"R+]
8w4F(A*h+a&e'{!
@)M7s&^intcal(intx)1r9P4L&?
3k(M8P+f$q
{
&y1n"m9R4_5g,vif(x==0).s$z0I P!
T1O'W!
@
return0;*z:
T8}7d+R9p
else
;|1P;^:
y*o6c(I1Yreturnx+cal(x-1);
L6k-X,g4h+K-?
"_/N}
9m+p7C/M9?
j)M8G H(}$I(a:
R-d3[;}#W
4、以下程序的结果?
8f7N$z/g&c+{-V2X*]8evoidfoo(int*a,int*b)"(\4^.o#p,o7c2y9M6c0S
{
+\(t4e5W.Q+[2\*a=*a+*b;
&g4_,o0W;[.h%p"m3f*b=*a-*b;
$_8D'b.e#M)m&R d"G*a=*a-*b;3s/J:
i9L0Y:
y
}6{6d/}#D3f"g2v8c)v
"L4L:
];])_#wvoidmain()
(Y:
^*[+d(D0U9R#{{&t&~*]&i1a!
a5K
inta=1,b=2,c=3;7o-U-h1o5i,E
foo(&a,&b);
*`:
r8I2[-f ~0D,A0ofoo(&b,&c);
0k4I&l1h5wfoo(&c,&a);
(k#s7X-|'e)i6P*b"O#`printf("%d,%d,%d",a,b,c);
9`0f9\5w,j M9N}
'Y.[8g;n*w;u2p'o5、下面哪项不是链表优于数组的特点?
%S1U)_1g5T,d$R#W-K7L/p1.方便删除2.方便插入3.长度可变4.存储空间小
4K$J$l+r#a2W+F8\)Q6、T(n)=25T(n/5)+n^2的时间复杂度?
9y r&x:
h8d$A,?
8I4M7、n个顶点,m条边的全连通图,至少去掉几条边才能构成一棵树?
.q(|7g/i*G#~4K-o8、正则表达式(01|10|1001|0110)*与下列哪个表达式一样?
4V3A3w6|-H.q
;G%q3E"a5D,j"{5D/K
9、如何减少换页错误?
3C-I:
g/r6^
1.进程倾向于占用CPU 2.访问局部性(localityofreference)满足进程要求)
3@4M"?
0z9X$Y0x0m3.进程倾向于占用I/O 4.使用基于最短剩余时间(shortestremainingtime)的调度机制
'E-a!
F.C&i5.减少页大小
Q-V7V9{2C8s:
s6T2{/J!
B$a5}!
@9V.C9y
10、实现两个N*N矩阵的乘法,矩阵由一维数组表示8[7M$^ {+v/a3^
6}#Y7q/D,\$I'C1z
11、找到单向链表中间那个元素,如果有两个则取前面一个2t1v4U,h0b3D.d
%u#c!
M8p:
A12、长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可以用除法。
要求对算法的时间复杂度和空间复杂度作出分析,不要求写程序。
google浙大招聘笔试题(转)
一、单选
0g.i6_,L:
L%[8@1、80x86中,十进制数-3用16位二进制数表示为?
0d-Y.h'L4R*j;k0
2、假定符号-、*、$分别代表减法、乘法和指数运算,且 }(`2
1)三个运算符优先级顺序是:
-最高,*其次,$最低;&}7Y5l-J5e8S1^:
c#K4S
2)运算符运算时为左结合。
请计算3-2*4$1*2$3的值:
/G$B*I)G7}(A)4096,(B)-61,(C)64,(D)-80,(E)512'O*x6~+l8?
;a
6N*w)L5g/U7L)o*H3、下列伪代码中,参数是引用传递,结果是?
)C,u+p6|4o
calc(doublep,doubleq,doubler)
:
N-X2c)I'L3_+Y{q=q-1.0;r=r+p}
"d/J,h0],u$l"V N6nmain(){
:
^)Q2T$K$l-p4Vdoublea=2.5,b=9.0;
8@)@2{"~-o h,j$]#Vcalc(b-a,a,a);/
print(a);
+A%G;Y%h2x1^}8r7`/B1i4L/@4{)J
(A)1.5(B)2.5(C)10.5(D)8(E)6.56f,e!
t#^6P,i$
4、求输出结果:
(b m2H2C$u E5Hintfoo(intx,inty){ I2]-l l!
j(B5i1R7a
if(x<=0||y<=0)return1;;],\0],M-N"|,Q
return3*foo(x-1,y/2);
1s!
C;m8e)r*k-S%a7e-P}
/{9x1A/{*P"cprintf("%d\n",foo(3,5));5y5J"n(_.^1n'_,B4A#^,p
(A)81(B)27(C)9(D)3(E)1/e"F#S0V%r$B
*Q8Q0n%M'e7S)z
5、下列哪个数据结构在优先队列中被最广泛使用?
5V5c+F.k)h0l9Z
(A)堆(B)数组(C)双向链表(D)图(E)向量
;`3a$H1u;n#I1i8s,d$a!
B9V,x'T*t:
m5d
6、以下算法描述了一个在n国元素的双向链表中找到第k个元素的
5F:
?
%W)i6x0H*[*`方法(k>=1且k<=n):
/d1L;d0k n#?
-F(t
如果k<=n-k,从链表开始往前进k-1个元素。
1H'k$c&C*b-^;I9i9^否则,从终点出发,往回走n-k个元素。
+H1j.`#M1E8r'U3i这个算法的时间代价是?
6f,[)U"q+D*`2y"T
(A)θ(nlogn)(B)θ(max{k,n-k})(C)θ(k+(n-k))
+o+v+Z3t)z(D)θ(max{k,k-n})(E)θ(min{k,n-k})4v+]3L%p$p0z&t"Q%v0T4|4X
.\2r#z2V/j0b
7、有一个由10个顶点组成的图,每个顶点有6个度,那么这个图有几条边?
'Z3~2f&K0^1i8m
(A)60(B)30(C)20(D)80(E)90
5o/Z4O3f&y(O'p&L.D:
_2O
8、正则表达式L=x*(x|yx+)。
下列哪个字符串不符号L3Z3?
1k7y"N$\'a N8F7P(O
(A)x(B)xyxyx(C)xyx(D)yxx(E)yx8u,p;W,a'U9f-~
J;f$h9^1[5d/f"M-C6^9、为读取一块数据而准备磁盘驱动器的总时间包括%y(x+p0\8s&N.g&e
(A)等待时间(B)寻道时间(C)传输时间(D)等待时间加寻道时间
:
s9K4H0o,w*M(E)等待时间加寻道时间加传输时间
1J0E9\,f0C5~4s2n,`8S!
l:
t0i4m
二、算法 ?
;O*U6B9P
1、打印出一个二叉树的内容。
7k0z2{(k5f!
{:
A!
h0}2、在一个字符串中找到第一个只出现一次的字符。
如abaccdeff,输出b。
2y X-y8d9P:
v8\7x/@
3、给定一个长度为N的整数数组(元素有正有负),求所有元素之和
"f%L/G,m#s最大的一个子数组。
分析算法时空复杂度。
不必写代码。
附上算法题第3题的动态规划做法的参考答案:
最大子序列
问题:
给定一整数序列A1,A2,...An(可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大
例如:
整数序列-2,11,-4,13,-5,2,-5,-3,12,-9的最大子序列的和为20。
对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。
利用三重循环,依次求出所有子序列的和然后取最大的那个。
当然算法复杂度会达到O(n^3)。
显然这种方法不是最优的,下面给出一个算法复杂度为O(n)的线性算法实现,算法的来源于ProgrammingPearls一书。
在给出线性算法之前,先来看一个对穷举算法进行优化的算法,它的算法复杂度为O(n^2)。
其实这个算法只是对对穷举算法稍微做了一些修改:
其实子序列的和我们并不需要每次都重新计算一遍。
假设Sum(i,j)是A[i]...A[j]的和,那么Sum(i,j+1)=Sum(i,j)+A[j+1]。
利用这一个递推,我们就可以得到下面这个算法:
intmax_sub(inta[],intsize)
{
inti,j,v,max=a[0];
for(i=0;i {
v=0;
for(j=i;j {
v=v+a[j];//Sum(i,j+1)=Sum(i,j)+A[j+1]
if(v>max)
max=v;
}
}
returnmax;
}那怎样才能达到线性复杂度呢?
这里运用动态规划的思想。
先看一下源代码实现:
intmax_sub2(inta[],intsize)
{
inti,max=0,temp_sum=0;
for(i=0;i {
temp_sum+=a[i];
if(temp_sum>max)
max=temp_sum;
elseif(temp_sum<0)
temp_sum=0;
}
returnmax;
}
在这一遍扫描数组当中,从左到右记录当前子序列的和temp_sum,若这个和不断增加,那么最大子序列的和max也不断增加(不断更新max)。
如果往前扫描中遇到负数,那么当前子序列的和将会减小。
此时temp_sum将会小于max,当然max也就不更新。
如果temp_sum降到0时,说明前面已经扫描的那一段就可以抛弃了,这时将temp_sum置为0。
然后,temp_sum将从后面开始将这个子段进行分析,若有比当前max大的子段,继续更新max。
这样一趟扫描结果也就出来了。
google面试试题汇总(转)
笔试题目:
9道单选+3道问答"W,B2?
n2A8m2P+T)t
时间:
100分钟/A)Z;e4?
*l(d9Y,v'K
我做的是B卷。
3N1B;C6j&T#L/N)r
单选题:
&^:
g i/T g"n2p3{1,求两个二进制数的异或值,基本上学过一点计算机的东西的人都能对的题目。
。
!
?
;v6f/Y'}9P2,不记得了。
。
也是不需要思考的题目。
。
2]#P Z'p!
u:
N3,大概是如下的函数:
&`;n7E7B2A n-N7h)Y
intsomeFunc(intx){*]7D#_;F#m.b
if(x==0)
8S5{,T9~4~8L2Q2G3c!
I return0;(h5]5A&v:
{ x
else"l8_%U)R4L*l
returnx+someFunc(x-1);
2t1k-d#D"\/k7Q1E(M3]}6H-K c5W9W)J6Y8?
问这个计算的是什么。
。
。
%U!
m:
L/n,s6z8s$B$S8N
4,不记得了。
。
不需要思考吧。
。
o7{3q,e'y+k2C.~'B#N5,不记得了。
。
不需要思考吧。
。
+i#F8y T#T+R&x;L6,参见2,4,5。
。
-a1d!
b;}4w%{2Y9@
7,似乎需要思考一下。
。
u5F c;W,l0S
8,问链表结构和数组相比的优势不包括哪项,
$Q2U7C/v5`-z.i/l包括:
1S8].C'Z#C"G"c
插入的时间/q:
x.R2f6w'|:
x2H9j8D4y$R
删除的时间1S/\'S2b-T%U!
I+J7I
存储空间2V8L&~;s8y6O%T2y
剩下两个不记得了。
。
"]-`,P4q!