zoukankan      html  css  js  c++  java
  • 2012搜狗校园招聘笔试题

    1、下面代码中for循环共执行了多少次?

    unsigned short i,j;
    for(i=0, j=2; i!=j; i+=5, j+=7)
    {}

    unsigned short占用2个字节,当数据范围到头了(2^16-1),就又从0开始计数了,这个其实就是两辆汽车行驶在一个圆圈里的汽车追及问题。一个速度为5,一个速度为7,当速度为7的超越速度为5的时候,两个汽车就相遇了,2 + 7n - 5n = 2^16 所以共循环了32767次。

    unsigned short i,j;  
    for(i=3,j=7;i!=j;i+=3,j+=7)  

    这个也是一样的,7 + 7n - (3+3n) = 2^16

    2、下面程序应该输出多少?

    #include <iostream.h>
    using namespace std;
    
    char *c[] = { "ENTER", "NEW", "POINT", "FIRST" };   
    char **cp[] = { c+3, c+2, c+1, c };   
    char ***cpp = cp;   
      
    int main()  
    {   
        printf("%s", **++cpp);   
        printf("%s", *--*++cpp+3);   
        printf("%s", *cpp[-2]+3);   
        printf("%s
    ", cpp[-1][-1]+1);   
        system("pause");
        return 0;  
    }

    输出:POINTERSTEW

    关键是理解,数组的下标表示的真正的意义,是偏移-offset,a[i]对于编译器的意思是,取出符号a代表的地址,pa,在加上i*sizeof(a元素)的偏移量,最后解析出来对应的地址的内容。

    3、已知程序代码如下:

    struct S  
    {  
        void func1(S &);  
        void func2(const S&);  
        void func3(S&) const;  
        void func4(const S&) const;  
    };  

    下面哪些能正常执行()

    A、makeS().func1(makeS())

    B、makeS().func2(makeS())

    C、makeS().func3(makeS())

    D、makeS().func4(makeS())

    在gcc上做的实验,这个结果和maskS()有关。首先
    S makeS() 
    {
     S s;
     return s;
    }
    如果这样写的话,有1和3,不能正常运行,这个时候makeS返回的为一个临时的对象,如果func1(S&)这样试图对这个临时的对象进行改变是没有意义的,改变了对于程序员来说也是没有意义的。gcc的就编译不过去了,编译不过去的原因可能是试图寻找参数为非引用的函数,但是没有找到。如果改成了
    S& makeS() 
    {
     S s;
     return s;
    }
    返回的为一个引用,这个时候编译器会警告我们,但是可以编译通过,四个函数都可以找到。还可以写成
    S& makeS() 
    {
     S *s = new S;
     return *s;
    }
    这个时候编译器就啥也不说了。

    4、下列代码的输出为多少?

    int main(void)  
    {  
        enum {a, b=5, c, d=4, e};  
        enum {h,x, y, z, v=120, w, r=99,s,t};  
        return 0;  
    }  

    a、c、e、h、x、y、z、w、s、t的值分别是多少?

    在枚举类型中声明的第一个枚举成员它的默值为零。没有显示赋值的枚举成员的值,总是前一个枚举成员的值+1。
    a:0          c:6            e:5

    h:0          x:1           y:2            z:3           w:121               s:100                 t:101

    5、高度为1的平衡二叉树节点为1个,高度为5的平衡二叉树节点最少多少个?
    假设高度为n的平衡二叉树至少需要的节点数目是m,那么只需要在草稿纸上画一下,我们容易知道:
    n=1时,m=1;
    n=2时,m=2;
    n=3时,m=4;
    n=4时,m=7;
    n=5时,m=12;
    另外,这个题也是有规律的,F(n)=F(n-1)+F(n-2)+1

    6、
    union Test
    {
       char a[4];
        short b;
    };
    Test test;
    test.a[0]=256;
    test.a[1]=255;
    test.a[2]=254;
    test.a[3]=253;
    printf("%d ",test.b);
    问题:在80X86架构下,输出什么值?填空题。

    输出:-256

    short类型占2个字节,如果右边是低地址,左边是高地址,那么存储如下:
    1111  1111           0000   0000
      test.a[1]               test.a[0]
    显然b占用上面的2个字节,最高位为1,则是一个负数,取反+1后,得到-256(1000 0001 0000 0000)

    7、下面代码输出什么?

    #pragma pack(4)  
      
    int  main(void)   
    {  
        unsigned char puc[4];  
      
        struct tamPIM  
        {  
            unsigned char ucPim1;  
            unsigned char ucData0:1;  
            unsigned char ucData1:2;  
            unsigned char ucData2:3;  
        }*pstPimData;  
      
        pstPimData = (struct tamPIM*)puc;  
        memset(puc, 0 , 4);  
        pstPimData->ucPim1 = 1;  
        pstPimData->ucData0 = 2;  
        pstPimData->ucData1 = 3;   
        pstPimData->ucData2 = 4;  
        printf("%02x %02x %02x %02x
    ",puc[0],puc[1],puc[2],puc[3]);  
      
        return 0;  
    } 
    #pragma pack()  

    第一个自己直接存储0x01,这个不需要解释的。关键是第二个自己的存储,首先1个bit为用来存储2,导致最低位存0 ,其次两位 11,再其次三位100,最后空两个00。
    如果右边是低地址,左边是高地址,那么存储如下:
    0000 0000        0000 0000      0010 0110       0000 0001

     puc[3]                puc[2]           puc[1]             puc[0]
    所以,输出:01 26 00 00

    8、C++什么时候使用拷贝构造函数?
    在下面几种情况下会调用拷贝构造函数:
    a、   显式或隐式地用同类型的一个对象来初始化另外一个对象。如上例中,用对象c初始化d;
    b、  作为实参(argument)传递给一个函数。如CClass(const CClass c_class)中,就会调用CClass的拷贝构造函数;
    c、  在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数;
    d、  初始化序列容器中的元素时。比如 vector<string> svec(5),string的缺省构造函数和拷贝构造函数都会被调用;
    e、  用列表的方式初始化数组元素时。string a[] = {string(“hello”), string(“world”)}; 会调用string的拷贝构造函数。

    9、 call by value和call by reference的区别?
    解答:call by value复制了实参,而call by reference相当于使用了实参的别名。

    10、下列哪种操作可能带来死锁?A: C(可能在第二个lock(m1)产生死锁)
    A、lock(m1) lock(m2) unlock(m1) unlock(m2)
    B、lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
    C、lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
    D、lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)

    11、外部排序常用的算法?
    A、归并排序       B、快速排序         C、堆排序        D、希尔排序

    12、 在对空间和时间都有限制的实时系统中,常使用的排序算法?
    A、插入排序          B、堆排序          C、快速排序          D、归并排序


    13、以下程序输出什么?

    int main(void)  
    {  
        unsigned int un = -1;      // 0~4294967295  
        unsigned short us = -1;    // 0~65535  
      
          
        printf("%d %d
    ",us,un);  
        /* 
        us的二进制表示是0xffff,以4个字节的int类型输出时表示的是0x0000ffff,所以输出65535 
        un的二进制表示是0xffffffff,以4个字节的int类型输出时表示的是-1,所以输出-1 
        */  
      
        cout<<us<<endl;   // -1在无符号的short数据中是65535  
        cout<<un<<endl;   // -1在无符号的int数据中是4294967295  
      
      
        //printf("%x %x
    ",us,un);      // 16进制的形式  
        //printf("%p %p
    ",&us,&un);    // 输出地址  
      
        return 0;  
    }  

    输出:65535 -1
    65535
    4294967295

    14、一个长度为n的数组a[0],a[1],...,a[n-1]。现在更新数组的名个元素,即a[0]变为a[1]到a[n-1]的积
    a[1]变为a[0]和a[2]到a[n-1]的积,...,a[n-1]为a[0]到a[n-2]的积。
    程序要求:要求具有线性复杂度,不能使用除法运算符。

    思路是思想跟这个一样,用两个数组b、c
    b[i] = a[0] *... * a[i - 1],c[i] = a[i + 1] *...*a[n] ,时间复杂度为O(2n)
    最后a[i] = b[i]*c[i],我在这里没用c数组,少用c【i】数组的话,程序写起来就不是太好理解,其实是一个道理。

    int main(void)  
    {  
        int i, a[]={1,2,3,4};  
        int temp, n=4;  
        int *b = new int[n];  
        b[0] = a[0];  
      
        for(i = 1; i < n-1; i++)  
        {  
            b[i]=b[i-1]*a[i];  
        }  
        b[n-1] = a[n-1];  
        for(i = n-1; i >= 0; i--)  
        {  
            temp = a[i];  
            if(i == n-1)  
                a[i] = b[i-1];  
            if(i>0 && i<n-1)  
            {  
                a[i] = b[i-1]*b[i+1];  
                b[i] = temp*b[i+1];  
            }  
            if(i == 0)  
                a[0] = b[1];  
        }  
      
        //输出最后的a元素  
        for(i = 0; i < n; i++)  
        {  
            printf("%d  ",a[i]);  
        }  
        return 0;  
    }  
  • 相关阅读:
    图书管理系统---基于form组件和modelform改造添加和编辑
    Keepalived和Heartbeat
    SCAN IP 解释
    Configure Active DataGuard and DG BROKER
    Oracle 11gR2
    我在管理工作中積累的九種最重要的領導力 (李開復)
    公募基金公司超融合基础架构与同城灾备建设实践
    Oracle 11g RAC for LINUX rhel 6.X silent install(静默安装)
    11gR2 静默安装RAC 集群和数据库软件
    Setting Up Oracle GoldenGate 12
  • 原文地址:https://www.cnblogs.com/sooner/p/3282168.html
Copyright © 2011-2022 走看看