都来见见,今天的几个面试题,有点深度。

都来看看,今天的几个面试题,有点深度。。。。
1,第一题:
C/C++ code
#include <stdio.h>
static int check(int q[], int x)
{
    int i;
    for(i=0; i<x; i++)
        if(q[i] == q[x] || q[i] == q[x] - (x - i)
            || q[i] == q[x] + (x - i))
            return 1;
    return 0;
}
static void print_q(int q[], int x)
{
    int i;
    for(i=0; i<x; i++)
        printf("(%2d,%2d) ",i,q[i]);
    printf("\n");
}
#define N  8
static void try(int q[], int x)
{
    int i;
    if(x < N)
        for(i=0; i<N; i++){
            q[x] = i;
            try(q, x+1);
        }
    else
        for(i=1; i<N; i++){
            if(check(q, i))
                continue;
            if(i == N-1)
                print_q(q, N);
        }
} 
int main(int argc, char *argv[])
{
    int queen[N];
    try(queen, 0);
})

1、这段代码的功能什么?(4分)
2、在代码左侧指出这段代码的一处错误。(6分)
3、在右侧空白给出更加完善高效的代码。(10分


2,第二题:
有八个硬币,有一个是假的,用天平量,不知道假的比真的重还是轻,请问:最少需要多少次,才能判断出假的,跟轻重(5分)。请用C代码实现(25分)。

3,第三题:
求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。


4,第四题:
递归题:
fun(int n)
{
  if(n == 0)
return 0;
  return fun(n/2)+1;
}

求fun(4) = ?


5,第五题:
某公司有1000个cpu,用10个箱子装,要求:无论客户要多少个cpu,都能整箱整箱的给客户。
问:怎样装cpu ?

6,第六题:
指针题:
int a[2][3] = {{1,2,3},{4,5,6}};
int *p = &a[0][0];
int m = (*p)*(*(p+2))*(*(p+4)); 
printf("%d", m);

m = ?
A:101 B:6 C:5 D:4


------解决方案--------------------
第3题 处理方法应该有很多种 可以设有指向双亲的指针, 先把两节点调整到一个高度,记下调整次数a
然后判断两节点是不是同一节点,是则退出,不是则同时调整到各自的双亲节点,记下调整次数b
答案为a+2b

第5题 第一箱装2^0个 第二箱装2^1个...第9箱装2^8个 第10箱装1000-前面的
------解决方案--------------------
2,第二题:
有八个硬币,有一个是假的,用天平量,不知道假的比真的重还是轻,请问:最少需要多少次,才能判断出假的,跟轻重(5分)。请用C代码实现(25分)。

这个至少得4次吧,好的情况下三次。
第一次,可以得到左右的轻重
第二次,选择轻的或者重的分开称,得到假的是轻的还是重的
第三次,分成2 2
最后 1 1

3,第三题:
求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

从根节点深搜,找到最深的叶子节点,把此叶子节点当做根节点,再次深搜得到最深的点,这两点之间的距离就是最大的。


4,第四题:
递归题:
fun(int n)
{
if(n == 0)
return 0;
return fun(n/2)+1;
}

求fun(4) = ?

2

5,第五题:
某公司有1000个cpu,用10个箱子装,要求:无论客户要多少个cpu,都能整箱整箱的给客户。
问:怎样装cpu ?

10个箱子容量分别是1 2 4 8 16 64 128 256 512 1024
只要把1000内数字转换为2进制,为1的位就用对应的箱子装,肯定是整箱

6,第六题:
指针题:
int a[2][3] = {{1,2,3},{4,5,6}};
int *p = &a[0][0];
int m = (*p)*(*(p+2))*(*(p+4));
printf("%d", m);

m = ?
A:101 B:6 C:5 D:4
15