谷歌-校招-面试经验

以下内容来自于应聘者回忆整理

很多同学都想得到谷歌的实习或者校招机会。那从过来人的角度谈谈,要通过谷歌的实习、校招面试,都有哪些经验和注意事项呢?今天就跟大家分享一下。以下答案仅是面试者个人观点,仅供参考。

总体情况:考试是第一页需要填写个人信息,包括实习经历、获奖情况、工作地点意向(国内、国外还是两者皆可之类)一个半小时的答题,全部手写。

一、单项选择题

1、如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少。关于一下几种典型的数据传输速率: 1.使用 USB2.0 闪存盘,往 USB 闪存盘上拷贝文件的数据传输速率2.使用 100M 以太网,在局域网内拷贝大文件时网络上的数据传输速率 3.使用一辆卡车拉 1000 块单块 1TB 装满数据的硬盘,以 100km/h 的速度从上海到天津(100km)一趟所等价的 数据传输带宽 4.使用电脑播放 MP3,电脑的 PCI 总线到声卡的数据传输速率 在通常情况下,关于这几个传输速率的排序正确的是(A)

A.4<1<2<3 B.1<4<2<3 C.4<1<3<2 D.1<4<3<2

解析:普 通 U 盘写数据的 6MB/s,即 48Mbps; 100M 以太网的速率就是 100Mbps; 卡车拉硬盘,1000x1000x8/3600=2222Mbps,这个应该是最快的; MP3 在 256kbps 码率下也平均只有 1 分钟 2MB,所以不会超过 0.3Mbps,所以一定是最慢的

2、对以下程序,正确的输出结果是 #define SUB(x,y) x-y#define ACCESS_BEFORE(element,offset,value) *SUB(&element, offset) =valueint main(){ int array[10]= {1,2,3,4,5,6,7,8,9,10}; int i; ACCESS_BEFORE(array[5], 4, 6); printf("array: "); for (i=0; i<10; ++i){ printf("%d", array); } printf("n"); return (0);}(D)

A.array: 1 6 3 4 5 6 7 8 9 10

B.array: 6 2 3 4 5 6 7 8 9 10

C.程序可以正确编译连接,但是运行时会崩溃

D.程序语法错误,编译不成功

解析:gcc 提示的错误是“赋值号的左边操作数需要一个左值”。其原因是调用宏的那句被预处理器替换成了: *&array[5]-4 =6; 由于减号比赋值优先级高,因此先处理减号;由于减号返回一个数而不是合法的左值,所以编译报错。

3、在区间[-2, 2]里任取两个实数,它们的和>1 的概率是:(C)

A.3/8 B.3/16 C.9/32 D.9/64

解析:先画出 y=1-x 的线,上侧阴影部分就是 y>1-x,其所占比例为 9/32

4、小组赛,每个小组有 5 支队伍,互相之间打单循环赛,胜一场 3 分,平一场 1 分,输一场不得分,小组前三 名出线。平分抽签。问一个队最少拿几分就有理论上的出线希望(B)

A.1 B.2 C.3 D.4

5、 用二进制来编码字符串“abcdabaa”,需要能够根据编码,解码回原来的字符串,最少需要多长的二进制字符 串?(B)

A.12 B.14 C.18 D.24

解析:对 abcd 进行 Huffman 编码。首先根据权值建立 Huffman 树,得到最优编码: a=0, b=10, c=110, d=111 然后数一下就行了

6、10 个相同的糖果,分给三个人,每个人至少要得一个。有多少种不同分法 (D)

A.33 B.34 C.35 D.36

解析:一共这么几种情况: 118,127,136,145; 226,235,244; 334; 然后有数字重复的算 3 种排列,不重复的算 6 种排列,共计 4×3+4×6=36 种。

7、 下列程序段,循环体执行次数是: y=2 while(y<=8) y=y+y;(D)

A.2 B.16 C.4 D.3

8、下面哪种机制可以用来进行进程间通信?(D)

A.Socket B.PIPE C.SHARED MEMORY D.以上皆可

9、下列关于编程优化的说法正确的是(D)

A.使用编译器的优化选项(如-O3)后程序性能一定会获得提高

B.循环展开得越多越彻底,程序的性能越好

C.寄存器分配能够解决程序中的数据依赖问题

D.现代主流 C/C++编译器可以对简单的小函数进行自动 Iinline

解析: A 选项的优化只能针对代码本身,纯系统调用什么的是不会性能提升的(当然也不会下降), B 选项我觉得是在并行优化方面,好的编译器可以从循环中发掘并行性,展开之后就不行了, C 选项消除数据依赖主要有两个方法,一种是 SSA,即静态单赋值[3],这是通过对变量进行重命名 实现的,严格的说应该叫“寄存器重命名”[4]而不是“寄存器分配”;另外一种是调换指令顺序,这种只要不是 真相关(写后读,RAW)的话都可以消除掉,也不属于寄存器分配。

10、一下程序是用来计算两个非负数之间的最大公约数: long long gcd(long long x, long long y) { if( y==0) return 0; else return gcd (y, x%y);}我们假设 x,y 中最 大的那个数的长度为 n,基本运算时间复杂度为 O(1),那么该程序的时间复杂度为(B)

A.O(1) B.O(logn) C.O(n) D.O(n^2)

解析:求最大公约数用的是辗转相除法(欧几里得算法),所以是 O(logn)

二、程序设计与算法 (第一题和第二题为编程题,需给出代码实现;第三题为算法设计题,只需设计思路和关键步骤伪代码)

1、写函数,输出前 N 个素数。不需要考虑整数溢出问题,也不需要使用大数处理算法。

解析:主要就是对尝试对数 a 进行质因数分解,最容易写的就 是从 2 开始一直除到 sqrt(a),性能提升一点就从 2,3 然后除奇数一直到 sqrt(a)。当然还可以优化一下,建立一 个动态质数链表,将之前取到的所有质数加入表进行加速。

2、长度为 n 的数组乱序存放着 0 至 n-1. 现在只能进行 0 与其他数的 swap,请设计并实现排序。

解析:重载一下 swap 函数然后用传统排序法

3、给定一个原串和目标串,能对源串进行如下操作: 1.在给定位置插入一个字符 2.替换任意字符 3.删除任意字符 要求写一个程序,返回最少的操作数,使得源串进行这些操作后等于目标串。源串和目标串长度都小于 2000。

解析:基于动态规划 算法。事实上就是写出 LD 算法的伪代码 

想要更多谷歌实习、校招的机会,请点击这里

  • 1、刺猬实习遵循行业规范,任何转载的稿件都会明确标注作者和来源
  • 2、刺猬实习的原创文章,请转载时务必注明"来源:刺猬实习",不尊重原创的行为刺猬实习或将追究责任
  • 3、作者投稿可能会经刺猬实习编辑修改或补充。

相关推荐