非常经典的笔试题。
5.数据结构与算法(17道)
5.1数组与链表的区别?
(
1
)数组的元素个数在定义时就必须确定,且元素的类型必须一致;而链表的元素
个数自由,且元素内可以有不同类型的数据。
(
2
)数组的元素在内存中是按顺序存储的,而链表的元素是随机存储的。
(
3
)要访问数组的元素可以按下标索引来访问,速度比较快;如果对它进行插入
/
删
除操作的话,就得移动很多元素,所以对数组进行插入
/
删除操作效率很低。由于链表
是随机存储的,如果要访问链表中的某个元素的话,那就得从链表的头逐个遍历,直
到找到所需要的元素为止,所以链表的随机访问的效率就比数组要低;链表在插入
/
删
除操作上有很高的效率(相对数组)。一句话总结就是:数组的访问效率高,而链表
的插入
/
删除效率高。
5.2 a = b * 2; a = b / 4; a = b % 8; a = b / 8 * 8 + b % 4 ; a = b * 15; 效率最高的算法?
答案:
![](https://img-blog.csdnimg.cn/direct/8ca9509f7f624738b163be4eaa4ac62a.png)
解读:
*
、
/
、
%
分别可以用
<<
、
>>
、
&
来实现,效率更高。
5.3 C语言程序代码优化方法
(
1
)选择合适的数据结构与算法;
(
2
)使用尽量小的数据类型;
(
3
)使用自加、自减指令;
(
4
)用移位实现乘除法运算;
(
5
)求余运算用
&
(如
a=a%8
改为
a=a&7
);
(
6
)平方运算用
*
(如
a=pow(a,2.0)
改为
a=a*a
);
(
7
)延时函数的自加改为自减;
(
8
)
switch
语句中根据发生频率来进行
case
排序;
(
9
)减少运算的强度。
5.4时间换空间、空间换时间的例子?
(
1
)时间换空间:冒泡排序。
(
2
)空间换时间:快速排序。
5.5什么是满二叉树、完全二叉树、平衡二叉树?
(
1
)当一个树每一层的结点个数都达到最大时,这个树是满二叉树。
(
2
)当一个树除了最后一层外其他每一层的结点数都达到最大,且最后一层的叶子
结点都靠左排列时,这个树是完全二叉树。满二叉树是一种特殊的完全二叉树。
(
3
)当且仅当一个树两个子树的高度差不超过
1
时,这个树是平衡二叉树。
5.6堆和栈的的区别?
![](https://img-blog.csdnimg.cn/direct/ef3604cde962490ab6acdf8f4ca10a9e.png)
5.8对线性表(7,34,55,25,64,46,20,10)进行散列存储时,若选用H(K)=K %9作为散列函数,则散列地址为1的元素有几个?
答案:
4
个,分别是:
55
,
64
,
46
,
10
。
解读:
将线性表元素代入散列函数,即可得到散列地址。