1.
在函数F中,本地变量a和b的构造函数(constructor)和析构函数(destructor)的调用顺序是:
解析:构造函数按照变量声明的顺序入栈;
析构函数按照相反顺序出栈;
a构造 b构造 b析构 a析构
A B 分别是一个类,a,b分别为一个实例,构造函数是用来初始化变量的,析构是用来释放构造函数定义的变量内存
2.假定指针变量p定义为“int *p=new int(100);”,要释放p所指向的动态内存,应使用语句( delete p)
解析:
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;
3.处理hash冲突有:开放定址法(线性探测法、线性补偿探测法、随机探测法),拉链法,建立公共溢出区,再散列法
4.Big-endian(大端序):数据的高位字节存放在地址的低端 低位字节存放在地址高端
Little-endian(小端序):数据的高位字节存放在地址的高端 低位字节存放在地址低端
字节的高位与低位
举个例子,int a = 0x12345678 ; 那么左边12就是高位字节,右边的78就是低位字节,从左到右,由高到低,(注意,高低乃相对而言,比如56相对于78是高字节,相对于34是低字节
地址的高端与低端
0x00000001
0x00000002
0x00000003
0x00000004
从上倒下,由低到高,地址值小的为低端,地址值大的为高端。
5.写一个函数找出一个整数数组中,第二大的数;
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;
![](http://uploadfiles.nowcoder.com/images/20150810/120176_1439177938448_QQ%E6%88%AA%E5%9B%BE20150810114028.png)
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,在函数体内定义的内置类型变量都不进行初始化。