Google笔试题整理.docx

上传人:b****7 文档编号:10270490 上传时间:2023-02-09 格式:DOCX 页数:20 大小:27.17KB
下载 相关 举报
Google笔试题整理.docx_第1页
第1页 / 共20页
Google笔试题整理.docx_第2页
第2页 / 共20页
Google笔试题整理.docx_第3页
第3页 / 共20页
Google笔试题整理.docx_第4页
第4页 / 共20页
Google笔试题整理.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

Google笔试题整理.docx

《Google笔试题整理.docx》由会员分享,可在线阅读,更多相关《Google笔试题整理.docx(20页珍藏版)》请在冰豆网上搜索。

Google笔试题整理.docx

Google笔试题整理

Google笔试题整理(超全!

)附部分答案,希望能帮到有需要的人!

写出这样一个函数,输入一个n,输出从1到这个数字之间的出现的1的个数,比如f(13)等于6;f(9)等于1;网上有很多这道题的解法,大多采用穷举法。

这把这个算法题变成了程序设计,这道题,我认为是总结一个递推公式,然后用递推法实现,比较好。

后来在网上考证了一下,这道题本来也是让总结一个数学函数即可,无需编程。

既然写了,就贴出来,发表一下自己的解法。

这道题还有另一半,当f(n)=n是,最小的n是多少?

本人还没有好的方法,所以就不贴了。

 

下面的程序是上半部java实现的。

 

/*可以推出下列递推公式:

 *f(n)=(a>1?

s:

n-s*a+1)+a*f(s-1)+f(n-s*a)当n>9时;

 *L是n的位数

 *a是n的第一位数字

 *s是10的L-1次方

 *n-s*a求的是a后面的数.

 *公式说明:

 *求0-n由多少个数字1,分三部分,一是所有数中第一位有多少个1,对应(a>1?

s:

n-s*a+1)

 *当a大于1是,应该有a的L1次,a小于1是有n-s*a+1。

 *如n是223所有数中第一位有1是100;n是123所有数中第一位是1的有24

 *二是对应a*f(s-1)如n是223应该有2*f(99)个1

 *三是对应f(n-s*a)如n是223应该有f(23)个1。

 */

 

 

 longf(longn){

 if(n<9)returnn>0?

1:

0;

 intL=(int)(Math.log10(n)+1);//求n的位数l

 longs=(long)Math.pow(10,L-1);//求10的l-1次方,方便求后面n的第一位数字,及其后面的数。

 longa=(long)(n/s);//求n的第一位数字 

 return(a>1?

s:

n-s*a+1)+a*f(s-1)+f(n-s*a);

 }

 

google笔试题:

A+B=C

在一个集合S中寻找最大的C使A+B=C且A,B,C均在集合当中

解答(原创)

1,将集合S中的数排序X1<=X2<=X3.............Xn;

2,for(i=n;i>0;i--)

{

for(j=0,k=i-1;k>j;)

{

if(Xj+Xk>Xi)

{

     k--;

     cotinue;

}

if(Xj+Xk

{

     j++;

     contiue;

}

A=Xj;

B=Xk;

C=Xi;

break;

}

例子:

1,4,7,10,11,13,15,18,34

34:

1-18,4-18........15-18

18:

1-15,4-15,4-13,7-13,7-11

结果:

A=7;B=11,C=18;

第一个的题目(嗯,记的不是很完整):

在一棵(排序?

)二叉树中搜索指定值,数据结构定义为:

structNode

{

Node*lnext;

Node*rnext;

intvalue;

};

函数定义为():

Node*search(Node*root,intvalue)

{

}

实现这个search函数。

用递归,经典的树的遍历,pass先。

第二个的题目:

计算Tribonaci队列(嗯,九成九记错了那个单词……),规则是T(n)=T(n-1)T(n-2)T(n-3),其中T(0)=T

(1)=1,T

(2)=2。

函数定义:

intTribonaci(intn){

}

备注,不考虑证整数溢出,尽可能优化算法。

  这一题我一看就知道要考什么,很显然的递归定义,但也是很显然的,这里所谓的优化是指不要重复计算。

  简单的说,在计算T(n)的时候要用到T(n-1)、T(n-2)和T(n-3)的结果,在计算T(n-1)的时候也要用到T(n-2)和T(n-3)的结果,所以在各项计算的时候必须把以前计算的结果记录下来,去掉重复计算。

这里用到的一点小技巧就是要新写一个函数用来做这种事情,嗯,看看我写的代码吧!

/**

GetthevalueofT(n-1),andretrievetheresultof

T(n-2)andT(n-3).

@param[in]nTheninT(n).

@param[out]midValueofT(n-2).

@param[out]rightValueofT(n-3).

@returnValueofT(n-1).

*/

intfind_trib(intn,int&mid,int&right)

{

if(3==n)

{

mid=1;

right=1;

return2;

}

else

{

inttemp;

mid=find_trib(n-1,right,temp);

returnmidrighttemp;

}

}

/**

FindvalueofT(n).

@param[in]TheninT(n).

@returnValueofT(n).

@noteT(n)=T(n-1)T(n-2)T(n-3)(n>2)

T(0)=T

(1)=1,T

(2)=2.

*/

inttribonaci(intn)

{

if(n<0)

{

//Undefinedfeature.

return0;

}

if(0==n||1==n)

{

return1;

}

if(2==n)

{

return2;

}

intmid,right;

intleft=find_trib(n,mid,right);

returnleftmidright;

}

  啊啊,对了,答卷的时候我可没心情写注释……刚才到VC.Net2003上测试了一下,貌似没有啥问题。

唉,看来我多少还是懂一点算法的……

第三个的题目:

  在一个无向图中,寻找是否有一条距离为K的路径,描述算法即可,不用实现,分析算法的时间和空间复杂度,尽量优化算法。

 

 

 

05年Google笔试题

要笔试考题如下,其他题目是基础题,就不贴出了:

1、假设在n进制下,下面的等式成立,n值是()

567*456=150216

a、9b、10c、12d、18

2、文法G:

S->uvSvu|w所识别的语言是:

()

a、uvw*vub、(uvwvu)*c、uv(uv)*wvu(vu)*d、(uv)*w(vu)*

3、如下程序段输出是:

()

charstr[][10]={"Hello","Google"};

char*p=str[0];

count<

a、0b、5c、6d、10

4、cnt=0

  while(x!

=1){

    cnt=cnt1;

    if(x&1==0)

      x=x/2;

    else

  x=3*x1;

}

count<

当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!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1