面试:杂记(一)

    这里主要记录一些面试中被问过的问题。

1. realloc、malloc、calloc的区别

    工作用的主要是C++,所以只是对malloc了解一些。

    1) void *malloc ( size_t size )

        最常用的一个了,就是申请size个字节大小的空间了,这里不会对分配空间进行初始化操作。

    2) void *calloc ( size_t num_elements, size_t element_size )

        申请num_elements * element_size个字节大小的空间,即两个参数分别是元素个数即元素大小,element_size一般使用sizeof求出来的。除了参数外,calloc与malloc不同的还有它会将分配空间的每个位都初始化为0。

    3) void *realloc (void *ptr, size_t new_size )

        用于对已有空间进行调整,ptr为旧空间的地址,而new_size则会调整后的大小。对于ptr和new_size,有以下几种情况(假设旧空间的大小为old_size)。

        ptr != NULL 而 new_size == 0:此时相当于free函数,会释放ptr所指向的空间,并且返回NULL。

        ptr != NULL 而 new_size > old_size:扩大空间,先判断当前的指针是否有足够的连续空间,如果有,扩大ptr指向的地址,并且将ptr返回,如果空间不够,先按照new_size指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来ptr所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。注意扩大部分的空间内容是不会被初始化的。

        ptr != NULL 而 new_size < old_size:缩小空间,会将超出new_size的空间释放。

        ptr == NULL时,相当于调用malloc函数。

        当没有足够的空间用于扩大时,返回NULL而原来的内存块不变,所以这里不能直接用ptr = realloc(ptr, 100)这种方式,而需要先对返回值进行判断。

 

2. 100层楼丢两个玻璃球

        一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层??

       基本上都可以想到用分段的方法来解决。当时我给出的思路是分十段,找到临界点在第几段后再一层层尝试。但是这种方法,如果是在第1段最差次数是10次(1~10),在第2段则最差是11次(10~20),在第k段则最差是9+k次。很显然这是不平均的,层数越高,我们所需要测试的最差次数就越多。

       所以我们每一个分段的最差测试次数要尽量是一样的,这也是这个问题的考察点所在。通过上面的分析,我们可以发现平均分段时第一段比第二段少一次,第二段又比第三段少一次。那么,我们只需要让第一段层数比第二段层数少一层,第二段层数比第三段层数少一层就可以让每个分段的测试次数一样了。我们可以假设第一段层数为k,则有如下公式:

                                  k+k-1+k-2+...+ 2 >= n

      通过上面的算式我们可以得到k=14,即第一段的层数为k,也就是说我们的最差次数为14次。第一次在14层扔,没碎则在27层扔,以此类推。

 

3. 怎么判断一个数字是否是2的n次方数

      即判断一个数是否是2^n次方。很简单,如果数X是2的n次方,则其二进制必定为000010000这样子的格式,即只有一个位为1而其余位为0(不考虑符号位),则X-1为000001111,即原来为1的位变为0,该位后面的所有位全部都变为1。显然后000010000 & 000001111 == 0。

     所以,我们只需要判断X & (X-1)是否为0,为0则说明X是2的n次方,否则不是。

 

4. 为什么红黑树要限制不能是连续两个红节点

     当时自己的回答是如果可以连续是两个红节点,那么区分红黑节点就没有任何意义了。但感觉原因不是这个,然后找了下红黑树节点的来源,找到了下面的博客:

     清晰理解红黑树的演变---红黑的含义

     才知道红黑树的节点是由2-3树演变而来的。而2-3树是能够保持整个树的完美平衡的,但是由于2-3树实现复杂,所以才将3-节点中的最左边节点变成红节点而其他节点变成黑节点从而构造出了红黑树。假如可以是连续红节点,那回归到2-3树将出现某个节点是4-节点,会破坏掉2-3树的完美平衡。这便是我看完博客后觉得要限制不能是连续两个红节点的另一个原因了。

你可能感兴趣的:(面试,面试)