• 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;  
    }  
  • 相关阅读:
    C语言和指针-回顾02-const
    Linux内核学习-使用exec创建socket
    Archlinux安装和配置
    apt-get install failed
    Insmod module : operation not permitted
    5.2.5.用开发板来调试模块
    5.2.4.最简单的模块源码分析3
    5.2.3.最简单的模块源码分析2
    5.2.1.开启驱动开发之路
    总线,设备,驱动的关系
  • 原文地址:https://www.cnblogs.com/sooner/p/3282168.html
Copyright © 2020-2023  润新知