• google2013校园招聘笔试题(全国)



    google2013校园招聘笔试题 
    1、 单项选择题
    1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少。关于一下几种典型的数据传输速率:
    1.使用USB2.0闪存盘,往USB闪存盘上拷贝文件的数据传输速率
    2.使用100M以太网,在局域网内拷贝大文件时网络上的数据传输速率
    3.使用一辆卡车拉1000块单块1TB装满数据的硬盘,以100km/h的速度从上海到天津(100km)一趟所等价的数据传输宽带
    4.使用电脑播放MP3,电脑的pci总线到声卡的数据传输速率
    在通常情况下,关于这几个传输速率的排序正确的是:
    A. 4<1<2<3
    B. 1<4<2<3
    C.4<1<3<2
    D.1<4<3<2
    1.2.#define SUB(x,y) x-y
    #define ACCESS_BEFORE(element,offset,value) *SUB(&element, offset) =value
    int 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(" ");
    return (0);
    }
    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.程序语法错误,编译不成功
    1.3 在区间[-2, 2]里任取两个实数,它们的和>1的概率是:
    A.3/8
    B.3/16
    C.9/32
    D.9/64
    1.4 小组赛,每个小组有5支队伍,互相之间打单循环赛,胜一场3分,平一场1分,输一场不得分,小组前三名出线平分抽签。问一个队最少拿几分就有理论上的出线希望:
    A.1
    B.2
    C.3
    D.4
    1.5用二进制来编码字符串“abcdabaa”,需要能够根据编码,解码回原来的字符串,最少需要多长的二进制字符串?
    A.12
    B.14
    C.18
    D.24
    1.6 10个相同的糖果,分给三个人,每个人至少要得一个。有多少种不同分法
    A.33 B.34C.35D.36
    1.7 下列程序段,循环体执行次数是:
    y=2
    while(y<=8)
    y=y+y;
    A.2
    B.16
    C.4
    D.3
    1.8下面哪种机制可以用来进行进程间通信?
    A.Socket B.PIPEC.SHARED MEMORYD.以上皆可
    1.9 下列关于编程优化的说法正确的是:
    A. 使用编译器的优化选项后程序性能一定会获得提高
    B. 循环展开得越多越彻底,程序的性能越好
    C. 寄存器分配能够解决程序中的数据依赖问题
    D. 现代主流C/C++编译器可以对简单的小函数进行自动Iinline
    1.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),那么该程序的时间复杂度为:
    A.O(1)
    B.O(logn)
    C.O(n)
    D.O(n^2)
    2 程序设计与算法(2.1,2.2为编程题,2.3为算法设计题,只需设计思路和关键步骤伪代码)
    2.1 写函数,输出前n个素数。函数原型:void print_prime(int N); 不需要考虑整数溢出问题,也不许使用大数处理算法。
    2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他书的swap,请设计并实现排序( 必须采用交换实现)。
    2.3 给定一个原串和目标串,能对原串进行如下操作:
    1 在给定位置插入一个字符
    2 替换任意字符
    3 删除任意字符
    要求写一个程序,返回最少的操作数,使得原串进行这些操作后等于目标串。原串和目标串长度都小于2000.
    总结的参考答案:
    1.1 A
    USB 2.0的理论传输极限是480Mbps,但是按照这个速率就没有选项可选了-.-,所以猜测应该认为是普通U盘写数据的6MB/s,即48Mbps;
    100M以太网的速率就是100Mbps;
    卡车拉硬盘,1000x1000x8/3600=2222Mbps,这个应该是最快的;
    MP3在256kbps码率下也平均只有1分钟2MB,所以不会超过0.3Mbps,所以一定是最慢的。
    1.2 D
    这道题大家走出考场后争议非常大。咱啥也不说,直接进mingw跑一下gcc:

    gcc提示的错误是“赋值号的左边操作数需要一个左值”。其原因是调用宏的那句被预处理器替换成了:
    *&array-4 =6;
    由于减号比赋值优先级高,因此先处理减号;由于减号返回一个数而不是合法的左值,所以编译报错。
    1.3 C
    这道题我是蒙对的-.- 标准做法是先画出y=1-x的线,上侧阴影部分就是y>1-x,其所占比例为9/32:

    1.4 B
    这道题我从A开始凑胜负表,直到B凑出结果就OK了。
    1.5 B
    这道题需要对abcd进行Huffman编码。首先根据权值建立Huffman树,得到最优编码:
    a=0, b=10, c=110, d=111
    然后数一下就行了。
    1.6 D
    这道题我是穷举的orz……一共这么几种情况:
    118,127,136,145;
    226,235,244;
    334;
    然后有数字重复的算3种排列,不重复的算6种排列,共计4×3+4×6=36种。
    1.7 D
    这题很基本了。
    1.8 D
    一般学过操作系统这门课的都会吧,而且个人觉得D这个选项的出现不符合Google风格。
    1.9 D
    这题其实很好做,因为D肯定是对的,而且ABC的言论太绝对。但如果一定要给出解释的话……
    A选项的优化只能针对代码本身,纯系统调用什么的是不会性能提升的(当然也不会下降),
    B选项我觉得是在并行优化方面,好的编译器可以从循环中发掘并行性,展开之后就不行了,
    C选项有点说不清。消除数据依赖主要有两个方法,一种是SSA,即静态单赋值,这是通过对变量进行重命名实现的,严格的说应该叫“寄存器重命名”而不是“寄存器分配”;另外一种是调换指令顺序,这种只要不是真相关(写后读,RAW)的话都可以消除掉,也不属于寄存器分配。所以感觉不应该选这个。
    1.10 B
    求最大公约数用的是辗转相除法(欧几里得算法),所以是O(logn)。
    2.1
    这题比较基本,而且很多企业的笔试都爱考类似的。主要就是对尝试对数a进行质因数分解,最容易写的就是从2开始一直除到sqrt(a),性能提升一点就从2,3然后除奇数一直到sqrt(a)。当然还可以优化一下,建立一个动态质数链表,将之前取到的所有质数加入表进行加速。
    2.2
    这题我觉得除了重载一下swap函数然后用传统排序法之外也想不出什么高效的做法了。而且要代码实现,时间紧迫也不由得你多想。
    2.3
    这题个人觉得是这场笔试唯一拉分的题了,基于动态规划算法。事实上就是写出LD算法的伪代码。

    写出这样一个函数 ,输入一个 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。
    */


    long f(long n){
    if (n<9) return n>0?1:0;
    int L=(int)(Math.log10(n)+1);//求n的位数l
    long s=(long)Math.pow(10, L-1);//求10的l-1次方,方便求后面n的第一位数字,及其后面的数。
    long a=(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<Xi)
    {
    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;
    第一个的题目(嗯,记的不是很完整):
    在一棵(排序?)二叉树中搜索指定值,数据结构定义为:
    struct Node
    {
    Node * lnext;
    Node * rnext;
    int value;
    };
    函数定义为():
    Node * search(Node * root, int value)
    {
    }
    实现这个search函数。
    用递归,经典的树的遍历,pass先。
    第二个的题目:
    计算Tribonaci队列(嗯,九成九记错了那个单词……),规则是T(n) = T(n - 1) T(n - 2) T(n -3),其中T(0) = T(1) = 1,T(2) = 2。
    函数定义:
    int Tribonaci(int n) {
    }
    备注,不考虑证整数溢出,尽可能优化算法。
    这一题我一看就知道要考什么,很显然的递归定义,但也是很显然的,这里所谓的优化是指不要重复计算。
    简单的说,在计算T(n)的时候要用到T(n - 1)、T(n - 2)和T(n - 3)的结果,在计算T(n - 1)的时候也要用到T(n - 2)和T(n - 3)的结果,所以在各项计算的时候必须把以前计算的结果记录下来,去掉重复计算。这里用到的一点小技巧就是要新写一个函数用来做这种事情,嗯,看看我写的代码吧!
    /**
    Get the value of T(n - 1), and retrieve the result of
    T(n - 2) and T(n - 3).
    @param[in] n The n in T(n).
    @param[out] mid Value of T(n - 2).
    @param[out] right Value of T(n - 3).
    @return Value of T(n - 1).
    */
    int find_trib(int n, int & mid, int & right)
    {
    if (3 == n)
    {
    mid = 1;
    right = 1;
    return 2;
    }
    else
    {
    int temp;
    mid = find_trib(n - 1, right, temp);
    return mid right temp;
    }
    }
    /**
    Find value of T(n).
    @param[in] The n in T(n).
    @return Value of T(n).
    @note T(n) = T(n - 1) T(n - 2) T(n - 3) (n > 2)
    T(0) = T(1) = 1, T(2) = 2.
    */
    int tribonaci(int n)
    {
    if (n < 0)
    {
    // Undefined feature.
    return 0;
    }
    if (0 == n || 1 == n)
    {
    return 1;
    }
    if (2 == n)
    {
    return 2;
    }
    int mid, right;
    int left = find_trib(n, mid, right);
    return left mid right;
    }
    啊啊,对了,答卷的时候我可没心情写注释……刚才到VC.Net 2003上测试了一下,貌似没有啥问题。唉,看来我多少还是懂一点算法的……
    第三个的题目:

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

    05年Google笔试题 
    要笔试考题如下,其他题目是基础题,就不贴出了:
    1、假设在n进制下,下面的等式成立,n值是()
    567*456=150216
    a、 9 b、 10 c、 12 d、 18
    2、文法G:S->uvSvu|w所识别的语言是:()
    a、uvw*vu b、(uvwvu)* c、uv(uv)*wvu(vu)* d、(uv)*w(vu)*
    3、如下程序段输出是:()
    char str[][10]={"Hello","Google"};
    char *p=str[0];
    count<<strlen(p 10);
    a、0 b、5 c、6 d、10
    4、cnt=0
    while(x!=1){
    cnt=cnt 1;
    if(x&1==0)
    x=x/2;
    else
    x=3*x 1;
    }
    count<<cnt<<end1;
    当n=11时,输出:()
    a、12 b、13 c、14 d、15
    5、写一段程序判定一个有向图G中节点w是否从节点v可达。(假如G中存在一条从v至w的路径就说节点w是从v可达的)。以下算法是用C 写成的,在bool Reachable函数中,你可以写出自己的算法。
    class Graph{
    public:
    int NumberOfNodes();//返回节点的总数
    bool HasEdge(int u,int v);//u,v是节点个数,从零开始依次递增,当有一条从u到v的边时,返回true
    };
    bool Reachable(Graph&G, int v, int w){
    //请写入你的算法
    }
    6、给定一棵所有边的长度均为整数的树,现要求延长其中某些边,使得从根到任意节点的路径长度相等。问满足要求的树的边长度之和最小是多少?请写出你的算法,并分析时间复杂度。
    =====================================================================
    Google笔试题 
    1、 两个二进制数的异或结果
    2、 递归函数最终会结束,那么这个函数一定(不定项选择):
    1. 使用了局部变量 2. 有一个分支不调用自身
    3. 使用了全局变量或者使用了一个或多个参数
    3、以下函数的结果?
    int cal(int x)
    {
    if(x==0)
    return 0;
    else
    return x+cal(x-1);
    }
    4、 以下程序的结果?
    void foo(int*a, int* b)
    {
    *a = *a+*b;
    *b = *a-*b;
    *a = *a-*b;
    }
    void main()
    {
    int a=1, b=2, c=3;
    foo(&a,&b);
    foo(&b,&c);
    foo(&c,&a);
    printf("%d, %d, %d", a,b,c);
    }
    5、下面哪项不是链表优于数组的特点?
    1. 方便删除 2. 方便插入 3. 长度可变 4. 存储空间小
    6、T(n) = 25T(n/5)+n^2的时间复杂度?
    7、n个顶点,m条边的全连通图,至少去掉几条边才能构成一棵树?
    8、正则表达式(01|10|1001|0110)*与下列哪个表达式一样?
    1.(0|1)* 2.(01|01)* 3.(01|10)* 4.(11|01)* 5.(01|1)*
    9、如何减少换页错误?
    1. 进程倾向于占用CPU 2. 访问局部性(locality of reference)满足进程要求
    3. 进程倾向于占用I/O 4.使用基于最短剩余时间(shortest remaining time)的调度机制
    5. 减少页大小
    10、实现两个N*N矩阵的乘法,矩阵由一维数组表示
    11、找到单向链表中间那个元素,如果有两个则取前面一个
    12、长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可以用除法。要求对算法的时间复杂度和空间复杂度作出分析,不要求写程序。

  • 相关阅读:
    android状态栏
    python基础(二)——文件操作
    python基础(一)——字符串
    每日读书
    gradle相关
    EditText整体hint
    java生成pdf
    Androidstudio点9图报错
    【ASP.NET Core学习】使用JWT认证授权
    数据访问仓储模式的事务管理(Unit of Work)
  • 原文地址:https://www.cnblogs.com/tianzhi9885/p/4112901.html
Copyright © 2020-2023  润新知