360笔试题

1.

360笔试题_第1张图片

在函数F中,本地变量a和b的构造函数(constructor)和析构函数(destructor)的调用顺序是:

解析:构造函数按照变量声明的顺序入栈;

        析构函数按照相反顺序出栈;

        a构造   b构造    b析构    a析构

A   B 分别是一个类,a,b分别为一个实例,构造函数是用来初始化变量的,析构是用来释放构造函数定义的变量内存

2.假定指针变量p定义为“int *p=new int(100);”,要释放p所指向的动态内存,应使用语句( delete p)

解析:

360笔试题_第2张图片

C++:new实例化一个内存,delete删除一个内存

       new和delete是一个操作符;

      int   *a  = new  int(100);      //实例化一个int型的内存空间,里边的值为100;删除的话用delete  a;

      int    *b = new   int[100];         //实例化一个int型的内存空间,里边有100个数组,删除的话用

      delete []b

C语言:malloc(xxx)分配一个内存;

          free(xxx)释放一个内存;

          malloc和free是一个函数;

int  a=100;   int  *p=a;  p表示地址.*p表示指针(取p里边的值),&a = p;

int   a = 100;分配内存开始2000-2003

int  *p;

p = &a;  /*取地址*/  

所以*p=100;

360笔试题_第3张图片

3.处理hash冲突有:开放定址法(线性探测法、线性补偿探测法、随机探测法),拉链法,建立公共溢出区,再散列法

4.Big-endian(大端序):数据的高位字节存放在地址的低端 低位字节存放在地址高端

  Little-endian(小端序):数据的高位字节存放在地址的高端 低位字节存放在地址低端

字节的高位与低位

举个例子,int a = 0x12345678 ; 那么左边12就是高位字节,右边的78就是低位字节,从左到右,由高到低,(注意,高低乃相对而言,比如56相对于78是高字节,相对于34是低字节

地址的高端与低端

0x00000001

0x00000002

0x00000003

0x00000004

从上倒下,由低到高,地址值小的为低端,地址值大的为高端。

5.写一个函数找出一个整数数组中,第二大的数;

360笔试题_第4张图片

function   secNumber(arr){

          //定义数组的长度;

           var  len  = arr.length;

          //若是数组元素小于二,则返回未找到;

          if(len  < 2){

                   return   -1;

          }

           //定义两个变量最大和第二大,分别存放最大值和第二大的值;

           //循环遍历这个数组;

            for(var i = 2;i  <  len;i++){

                     if(arr[i] > max_num){   // arr[i]比最大的数字大

                                sec_num = max_num;

                                 max_num = arr[i];

                    }else  if(arr[i]  < max_num  && arr[i] >sec_num){

                                 sec_num = arr[i];

                    }

            }

        return   sec_num;

}

6.由权值为3,6,7,2,5,1的叶子结点生成一棵哈夫曼树,它的带权路径长度为57;

解析: 构造哈夫曼树步骤是,选择两个权值最小的点构造树,新树根权值为左右子树权值之和,新的权值放回到序列中,继续按照上述步骤构造树,直到只有一颗树为止。 树带权路径长度 就是每个叶子结点的权值*高度之和。所以 (5+ 6+ 7)*2+3*3+(1+2)*4=57;

360笔试题_第5张图片

7.一般是客户端先向服务器发送请求:

第一次握手发送一个序列号;

第二次握手的序列号是单独发送的,第二次握手的确认号是第一次握手序列号+1

第三次握手的序列号是第二次握手的确认号,第三次握手的确认号是是第二次握手的序列号+1

8.数据结构中N个顶点的连通图至少有多少个边:

         至少要有(N-1)条边(也就是树)才能保证图为连通图.

        对于简单图而言至多有n*(n-1)/2条边,此时即是完全图.

         一个n个顶点的连通无向图,其边的个数至少为:n-1;(中间一个点,其余的n-1个点和这个点连接)

        一个n个顶点的连通有向图,其边的个数至少为:n;

        N顶点无向连通图最多n!/[2! * (n-2)!]-1条边

9.关于将内存的分配空间初始化为0;

1) malloc 函数: void *malloc(unsigned int size)

在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。

2)calloc 函数: void *calloc(unsigned int num, unsigned int size)

按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。

calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。

3)realloc 函数: void *realloc(void *ptr, unsigned int size)

动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。

申请的内存空间不会进行初始化。

4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。

你可能感兴趣的:(360笔试题)