一、选择题
1、32位机上根据下面的代码,问哪些说法是正确的?()
signed char a = 0xe0; unsigned int b = a; unsigned char c = a;
A. a>0 && c>0 为真
B. a == c 为真
C. b 的十六进制表示是:0xffffffe0
D.上面都不对
考点:有符号数和无符号数之间的转换
解析:
2、下面哪些选项能编译通过()?
int i; char a[10]; string f(); string g(string &str);
A. if(!!i){f();}
B. g(f());
C. a=a+1;
D. g("abc");
考点:C++的细节掌握。
解析:
3、int a[10]; 问下面哪些不可以表示 a[1] 的地址?
A. a+sizeof(int)
B. &a[0]+1
C. (int*)&a+1
D. (int*)((char*)&a+sizeof(int))
考点:C++数组的指针表示形式的掌握
解析:
4、问下面的数据都存放在哪些存储区?
int main() { char *p = "hello,world"; return 0; }
A. 堆和静态数据区
B. 栈和静态数据区
C. 栈和常量区
D. 栈和堆
解析:其实,在做这一题的时候,我是当成Java来做的,呵呵
5、下面哪些说法正确?()
A. 数组和链表都可以随机访问
B. 数组的插入和删除可以 O(1)
C. 哈希表没有办法做范围检查
D. 以上说法都不正确
解析:
6、基于比较的排序的时间复杂度下限是多少?()
A. O(n)
B. O(n^2)
C. O(nlogn)
D. O(1)
解析:其实大家记住这个结论就好,在当前计算机科学界对于基于比较的排序最快只是O(n*logn),例如快速排序,堆排序,归并排序
7、有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?()
A. 1
B. 2
C. 3
D. 4
解析:大家要知道 C语言中的 ++ 和 += 并不是原子操作,而是通过多条微程序组成的,因此 ++ 和 += 在执行过程中可能被中断的
8、下面哪些函数调用必须进入内核才能完成?()
A. fopen
B. exit
C. memcpy
D. strlen
解析:
9、死锁发生的必要条件?()
A. 互斥条件
B. 请求和保持
C. 不可剥夺
D. 循环等待
考点:操作系统
解析:互斥条件,请求和保持,不可剥夺 ,循环等待,这些都可能导致发生死锁,所以以后大家在做多线程程序时一定要注意了。
10、内存管理中的 LRU 方法是用来管理什么的?()
A. 虚拟内存的分配
B. 虚拟内存的释放
C. 物理内存的分配
D. 物理内存的释放
考点:操作系统
解析:大家自己看书,我大概说下基本的。
1.页面调入:是给页面调入内存中,给它分配物理内存
2.页面置换,就是将内存中的页面置换出来,放到虚拟内存中,让物理内存空闲出来,让给需要使用的页面。
3.LRU:全称是:Least Recently Used(最近最久未使用)置换算法,所以这个算法涉及到了虚拟内存的分配和物理内存的释放。所以答案是AD。
11、求N个数中的最大值和最小值,最小比较次数是多少?
A 4n/3
B 2n-2
C n-1
D 3n/2
分析:解析:在编程之美上看过,利用分治思想
具体做法是:每次成对的处理数据,先将一对元素进行比较,然后把较大者与当前最大值比较,较小者与当前最小者比较,因此每两个元素需要3次比较。具体实现时需考虑n的奇偶,n为奇数,3【n/2】次;n为偶数,3n/2-2次。因此总的比较次数至多为3【n-2】。(注:【n】表示不大于n的整数)。
12、一棵二叉树的先序遍历是 f b a c d e g h,中序遍历是 a b d c e f g h,问后序遍历是什么
答案:adecbhgf
解析:根据先序遍历和中序遍历,我们可以构建一颗二叉树:
13、在32位little endian机器上运行该程序,得到结果是什么?
#include <stdio.h> int main() { long long a = 1, b = 2, c = 3; printf("%d %d %d \n", a, b, c); return 0; }
A.1 2 3
B 1 0 2
C ......
D 3 2 1
解析:因为long long 是8个字节的,%d是4个字节的,溢出覆盖了后面,然后又是小端规则的。
int a = 0x12345678; ----------------------------------> 78 56 34 12 (little endian) 12 34 56 78 (big endian)
【传入参数,由右往左,栈空间内存从高往低,little endian, 栈空间如下:
内存高位->
00000000 00000011
00000000 [00000010](c)
[00000000](b) [00000001](a)
<-内存低位
14、关于访问,下面哪些是后台绝对不会执行的?
A. 本地查查 DNS,是否有 sinaapp.com 的 ip;
B. 通过 cn. 查找 ip;
C. 通过 com. 查找 ip;
D. 浏览器发送 http get 请求;
E. 服务器回送 xxx.jpg;
15、高内聚和低耦合,下面哪个耦合度最高?
A. 通过函数参数传递...
B. 一个函数修改另外一个函数中的数据;
C. 通过全局变量...
D. 通过指示器...
解析:
16、TCP协议栈的定时器有哪些()
A....
B....
C....
D....
解析:百度了一下,TCP协议栈的定时器有延时定时器,重传定时器,坚持定时器,保活定时器
17、网卡,交换机,路由器和UDP分别工作网络的哪些层?
答案:依次是:物理层,链路层,传输层
二、填空题
1、在一个 big endian 的 32 位的计算机上,b 的结果是______
unsigned int a = 0x1234;
char b = *((char*)&a);
答案:0
解析:unsigned int是 4 个字节,0x1234 的完整表示是 0x 00 00 12 34,因为是 big endian从左数,所以,所以 &(取地址) 的话,如果当字节看的话,取到了最左边 00 字节的地址,一定要转换成 char 看的话,值就是 0。
2、一个有 800 个结点的完全二叉树,问有_____个叶子结点?
答案:400
根据二叉树的性质3可知:叶子结点数n0=n2+1,
根据完全二叉树的概念可知,度为1的结点数要么为1,要么为0,
二叉树总结点数N=n0+n1+n2=2n0+n1-1,
得出n0=(N+1-n1)/2=N/2向上取整,
解析:画图举例子很容易就可以推导出规律,通过这个公式即可计算得400
3、下面 get 是求一个二维数组元素的函数,请补全.
#include <stdio.h> #include <stdlib.h> #define M 3 #define N 4 int get(int *a, int i, int j) { _______ // 此处一个空 } int main() { int a[M][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int v; v = get(a, 2, 1); printf("a[2][1] == %d\n", v ); return 0; }
答案:return *(a+i*N+j);
解析:大家注意原型中的指针是int* a,所以必须用二维数组在内存中是一维排布这个知识点来做,直接 return *(a+i*N+j);而不是 return *(*(a+i)+j);
4、补全插入排序:
#include <stdio.h> #include <stdlib.h> int insert_sort(int *p, int count) { int i, j, tmp; if(p == NULL || count < 0) return 0; // for(i=1; i<count; i++){ tmp = p[i]; j = i-1; while(__________){ // 此处一个空 p[j+1] = p[j]; --j; } ___________; // 此处一个空 } return 1; } int main() { int i, a[10 = {3, 2, 1, 7, 8, 10, 4, 5, 6, 9}; insert_sort(a, 10); for(i=0; i<10; i++) printf("%d ", a[i); printf("\n"); return 0; }
答案:第一个空: j>=0 && p[j]>tmp 第二个空:p[j+1] = tmp;
5、使用 FIFO 管理页面请求,如果分配的物理块 M = 3 或是 4,请求顺序如下:4 3 2 4 4 3 5 4 5 3 1 5 1 5 1 5 4,问两种情况下页面失效的次数各是________和__________?
答案是9和6,
考点:操作系统
解析:M=3时:一开始是空的,所以4,3,2都页面失效。失效三次,然后4,4,3都有效,5失效一次,4先进来的所以先出去,变为3,2,5,然后4又失效一次,3出去,变为2,5,4,以此类推。就是先进来的先出去。最后加起来一共9次。M=4的也一样。只是能多存一个页。
6、软件可靠性评估的两个指标是___________和_____________?
答案:无错运行概率,平均故障时间
分析:大数据的处理,不要期望用普通方法丫,直接 hadoop 搭起来,hive 搭起来,将数据导入 hive 数据表中,写个简单的 HiveQL 语句搞定。统计每天登陆人数的 sql 语句类似 : select count(distinct user_id) from user_login_log where dt="$TODAY" 。但是如果一定要自己写程序的话,应该是多机器多线程,划分数据块,分块统计,最后合并结果,O__O"…,算了,就这样吧。
第二个问题,如果要统计在线人数最高的时刻,那么就应该按时间段(没有必要按时间点吧,O__O"…)划分数据,然后统计,就这样。