【本文链接】
1. 以下是一颗平衡二叉树,请画出插入键值3以后的这颗平衡二叉树。
分析:考察平衡二叉树的基本操作,插入3变成不平衡,需要节点5右旋一次,节点2左旋一次。。
2. 表达式X=A+(B*(C-D))/E的后缀表示形式可以是 XABCD-*E/+=
如何快速解答,增加括号。
3. 对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少。
0x5F123/8K=a*8k+b,页号是a,页内偏移量应该是b。
4. 如果X大于0并小于65536,用移位法计算X乘以255的值为: 255x=256x-x = (X<<8)-X
5. 一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有 4n-(n-1)=3n+1 个空指针。
6. 以下两个语句的区别是:第一个动态申请的空间里面的值是随机值,第二个进行了初始化,里面的值为0
int *p1 = new int[10];
int *p2 = new int[10]();
7. 计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式:0X12 小端模式:0X56 X86结构的计算机使用 小端 模式。
一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。
8. 在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:
int (*fun)(int *)
9. 头文件中ifndef / define / endif 是做什么用的?防止该头文件被重复引用。
10. 写出输出:char array[] = “abcde”; char* s = array;
cout<<sizeof(array)<<strlen(array)<<sizeof(s)<<strlen(s);
答案:6545
11. stable排序有InsertionSort,BubbleSort,MergeSort,CountSort,RadixSort。
12. 为什么对于n非常大的时候,堆排序的效率不如快排?
堆排序时,i 2i都是非常大的,要经常跨越长内存,甚至跨越缓存影响效率,而快排始终是在一个小范围内,而且越来越小。
13. [0,2,1,4,3,9,5,8,6,7]是以数组形式存储的最小堆,删除堆顶元素0后的结果是:
A. [2,1,4,3,9,5,8,6,7]
B. [1,2,5,4,3,9,8,6,7]
C. [2,3,1,4,7,9,5,8,6]
D. [1,2,5,4,3,9,7,8,6]
提示:最后一个元素7和0替换,然后将较小的child替换上去直到OK。
14. 在公司局域网上ping www.taobao.com没有涉及到的网络协议是()
A、ARP B、DNS C、TCP D、ICMP
DNS是将域名www.taobao.com映射成主机的IP地址,ARP是将IP地址映射成物理地址,ICMP是报文控制协议,由路由器发送给执行ping命令的主机,而一个ping命令并不会建立一条TCP连接,故没有涉及TCP协议。
15 http属于(应用层)协议,ICMP属于(网络层)协议。
16. 深度为k的完全二叉树至少有(2^(k-1))个结点,至多有(2^k-1)个结点。
17. 字节为6位的二进制有符号整数,其最小值是(-32)。
18. 设有28盏灯,拟公用一个电源,则至少需有4插头的接线板数(9)个。
第一个板4个口,此后每增加1个板会消耗1个原来的口,总的只增加3个口,故N个接线板能提供 1+3*N个电源口。
19 一台指针式钟表的时钟和分钟的指向重合的时间间隔是__。
A.720/13分钟 B. 720/11分钟 C. 60分钟D. 以上都不正确
【分析】时针60分钟走1/12*2π的弧度,V(时针)= 1/12*2π/60 (rad/min);分针60分钟走2π的弧度,V(分针)= 2π/60 (rad/min);假设从重合开始经过了T时间又重合了,则满足:V(时针)*T+2π=V(分针)*T。
20. 已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7计算散列地址,并散列存储在散列表A【0....6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为(C)
A、1.5 B、1.7 C、2.0 D、2.3
依次进行取模运算求出哈希地址:
A |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
记录 |
63 |
48 |
|
38 |
25 |
74 |
52 |
查找次数 |
1 |
3 |
|
1 |
1 |
2 |
4 |
74应该放在下标为4的位置,由于25已经放在这个地方,所以74往后移动,放在了下标为5的位置上了。
由于是等概率查找,所以结果为:1/6*(1+3+1+1+2+4)= 2.0
21.(B)设计模式将抽象部分与它的实现部分相分离。
A、Singleton(单例) B、 Bridge(桥接)
C、 Composite(组合) D、 Facade(外观)
22、typedef char *String_t; 和 #define String_d char * 这两句在使用上有什么区别?
答:typedef char *String_t 定义了一个新的类型别名,有类型检查。
而#define String_d char * 只是做了个简单的替换,无类型检查,前者在编译的时候处理,后者在预编译的时候处理。
同时定义多个变量的时候有区别,主要区别在于这种使用方式String_t a,b; String_d c,d; a,b ,c都是char*类型,而d为char类型
由于typedef还要做类型检查。。#define没有,所以typedef比#define安全。
23、OFFSETOF(s, m)的宏定义,s是结构类型,m是s的成员,求m在s中的偏移量。
#define OFFSETOF(s,m) ((int)&(((s*)0)->m))
24. 为了某项目需要,我们准备构造了一种面向对象的脚本语言,例如,对所有的整数,我们都通过Integer类型的对象来描述。在计算“1+2”时,这里的“1”,“2”和结果“3”分别为一个Integer对象。为了降低设计复杂度,我们决定让Integer对象都是只读对象,也即在计算a=a+b后,对象a引用的是一个新的对象,而非改a所指对象的值。考虑到性能问题,我们又引入两种优化方案:(1)对于数值相等的Integer对象,我们不会重复创建。例如,计算“1+1”,这里两个“1”的引用的是同一个对象——这种设计模式叫做(享元模式);(2)脚本语言解析器启动时,默认创建数值范围[1,32]的32个Integer对象。现在,假设我们要计算表达式“1+2+3+…+40”,在计算过程需要创建的Integer对象个数是(40)。
分析:1到7以及他们的和是不用创建的,从8开始,28(是1到7的和)+8=36,36需要创建,36+9=45,45需要创建…依次类推,在加数是32之前(含32)需要创建的对象是32-8+1=25,某数+32=某数之后33至40所表示的加数也要创建,这样有8个加数 + 8个和,共有16个数需要创建,注意,加数中包含36,这个我们已经创建了,所以有25+8+8-1=40个数的对象需要创建。
n sn
[1,7] no [1,3,....28] no
[8,32] no [36,45,...] yes
[33,40] yes [561,...] yes
总共25+8+8-1=40个
25 由9,2,5,7,构造一个Huffman树,带权路径长度为 9*1+2*3+5*3+7*2 = 44
提示:每次选取最小的2个节点组成一个新的节点。
26 Linux中进入目录都要x权限(执行权限),查看目录下的文件需要r权限(读权限)和x权限,因为相当于进入了目录。执行目录下某个可执行文件,需要进入目录的x权限,以及对该执行文件的x权限。
27 下面哪种排序法对12354最快?
A. quick sort
B. buble sort
C. merge sort
已经部分排序,bubbleSort只需要交换一次即可。
BubbleSort比较相邻元素a和b,如果a>b那么交换,这样一趟下来,最大的元素就到升到了最后。
28 依赖:用到了别人的方法或变量;关联:对称的,好比你是我的朋友,我也是你的朋友;
聚合:非对称的,员工与公司就是聚合关系,还有一个重要特点就是生命周期可以不同,员工离开了公司还是可以活的;组合:生命周期一致,好比人与心脏,一个没了另一个也没了。强度:依赖<关联<聚合<组合。
29 有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?()
A. 1
B. 2
C. 3
D. 4
解析:大家要知道 C语言中的 ++ 和 += 并不是原子操作,而是通过多条微程序组成的,因此 ++ 和 += 在执行过程中可能被中断的
第一种可能情况:现在假设两个线程没有并行顺序执行的那么结果显然是 4。
第二种可能情况:再假设现在第一个n++ 已经执行完了 但是结果还没有写回内存 这个时候 n+=2 已经全部执行完 2 写进了内存 结束 然后回到n++的写回操作 这个时候内存就从2被改回1了,后面再来一次n++ 结果就为2。
第三种可能情况: 第n+=2 先读取n的值到寄存器 即0入寄存器 这个时候被中断 第一个n++开始执行 并直到结束 内存被改成了1 ,然后 n+=2 继续执行 结束后内存变为2 第二个n++再执行 结果就是3
30 一棵二叉树的先序遍历是 f b a c d e g h,中序遍历是 a b d c e f g h,问后序遍历是什么
答案:adecbhgf
解析:根据先序遍历和中序遍历,我们可以构建一颗二叉树:
31 在一个 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。
32 select foo,count(foo) from pokes where foo>10 group by foo having count(*)>5 order by foo
SQL Select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。
因此 合理的答案应该为 from --where-- group by-- having --select-- order by
只有select选出了相应的表 才能对其排序,删除之类的操作
33 UNIX系统中,目录结构采用(带链接树形目录结构)
34 避免死锁的一个著名算法是(银行家算法)
35 怎么理解分配延迟? dispatch lantency 分配器停止一个进程到开启另一个进程的时间
36 入栈出栈顺序问题,卡特兰数:n=5,那么h(5) = C(2n,n)/(n+1) = 42
37 a+b*(c-d)/e-f的逆波兰式是:abcd-*e/+f-
38 计算 a^b << 2 ===> a^(b<<2)
移位运算<< >>优先级高于位运算& | ^。
39 不使用其他变量,交换两个整型a,b的值
答案:x = x+y; y = x-y; x = x-y
40、写出float x 与“零值”比较的if语句。
if(x>=0.000001 && x<=-0.000001)(x不为0的比较)
float: 6位精度
double: 16位精度