一些面试题收集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012658346/article/details/52212916

1、const的实现机制
  const修饰指针时,如果const位于’* ‘的左侧,则const就是用来修饰指针所指向的变量,即指针指向一个常量;
  如果const位于’* ‘的右侧,const就是修饰指针本身,即指针本身是常量,指针不能改变。
  
  define宏定义是在预处理阶段直接展开的,不会有任何检查机制。而const是在编译期实现的,会进行编译期检查
  const的实现机制:
  1)const只会在编译期进行检查,而不会有运行期保护。
  2)编译器会检查const变量有没有被修改,如果有代码尝试修改一个const变量,编译器会报错。
  3)然后在使用了const变量的地方直接用初始值替换,类似宏定义  

int main()  
{  
    const int con_var1 = 3;  
    int * b = (int *)&con_var1;  
    *b = 5;  

    printf("%d",con_var1);   //输出5,con_var1被改变了
}  



2、在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
  不妨假设10G个整数是64bit的。,2G内存可以存放256M个64bit整数。
  我们可以将64bit的整数空间平均分成256M个取值范围,即以最高字节来进行分类统计,用2G的内存对每个取值范围内出现整数个数进行统计。这样遍历一次10G整数后,我们便知道中数在哪个范围内出现,以及这个范围内总共出现了多少个整数。
  如果中数所在范围出现的整数比较少,我们就可以直接对这个范围内的整数进行排序,找到中数。如果这个范围内出现的整数比较多,我们还可以采用同样的方法将此范围再次分成多个更小的范围。



3、有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?
  可以通过bitmap的方式统计。一个字节有8个bit,可以表示8个数,10w个数则需要(100 000 / 8 =12500)字节,如果一个整数是32bit = 4字节,那么最多需要12500 / 4 = 3125个整数。
  因此申请3125个整数的数组,将数组置0,然后遍历所有数据,并将对应bit位置1.再依次遍历数组中的每个数,如果对应bit位为0,则说明该数缺失



4、1024! 末尾有多少个0?
  末尾0的个数取决于乘法中因子2和5的个数。显然乘法中因子2的个数大于5的个数,所以我们只需统计因子5的个数。
  是5的倍数的数有: 1024 / 5 = 204个
  是25的倍数的数有:1024 / 25 = 40个
  是125的倍数的数有:1024 / 125 = 8个
  是625的倍数的数有:1024 / 625 = 1个
  所以1024! 中总共有204+40+8+1=253个因子5,也就是说1024! 末尾有253个0。



5、判断一个数是不是2的n次幂
  如果一个数是2的整数次幂,那么该数的二进制中只有最高位为1,其它位都为0



6、设计一个洗牌的算法,并说出算法的时间复杂度。
  第一种: for i:=1 to n do swap(a[i], a[random(1,n)]); // 凑合,但不是真正随机
  第二种: for i:=1 to n do swap(a[i], a[random(i,n)]); // 真正的随机算法
  其中,random(a,b)函数用于返回一个从a到b(包括a和b)的随机整数。算法复杂度是O(n)



7、socket编程,如果client断电了,服务器如何快速知道?
  使用定时器(适合有数据流动的情况);
  使用socket选项SO_KEEPALIVE(适合没有数据流动的情况);



8、socket在什么情况下可读?
  1. 接收缓冲区有数据,一定可读
  2. 对方正常关闭socket,也是可读 (收到FIN,但是如果调用read,读到的数据为0,此时应该关闭socket)
  3. 对于侦听socket,有新连接到达也可读(同样可以读到的数据为空,此时应该调用accept获取连接)



9、 以下代码输出结果:

#include <stdio.h>
#include <unistd.h>
int main(void)
{
    printf("call execl"); 
    sleep(1); 
    execl("/bin/sh", "", NULL); 
    printf("error!\n");
}

  本题考标准IO缓冲,标准出错是不带缓冲的。如果是涉及终端设备的其他流,则他们是行缓冲的;否则是全缓冲的。
  printf是标准IO的一个,格式化打印到标准输出,在这里是行缓冲,那么没有遇到换行符也就是‘\n’或者没有强制flush, 则不会输出。
  execl是创建新的可执行程序映像,一旦成功就不会返回了,只有在出错的情况会返回1.
  所以以上的程序没有打印printf的内容,直接执行/bin/sh,因此没有输出


to be continued~~

猜你喜欢

转载自blog.csdn.net/u012658346/article/details/52212916