试解几道面试题

来源:互联网 发布:德芙是代可可脂吗 知乎 编辑:程序博客网 时间:2024/05/19 13:06

部门要搞什么“技能定级考试”,突击一下算法题。在网上随意找了几道题。

题虽然不难,但是要兼顾效率和复杂性的话,还是要动点脑筋。

题目:

1、链表和数组的区别在哪里?    
2、编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?    
3、编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?    
4、请编写能直接实现strstr()函数功能的代码。    
5、编写反转字符串的程序,要求优化速度、优化空间。    
6、在链表里如何发现循环链接?    
7、给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。    
8、写一个函数,检查字符是否是整数,如果是,返回其整数值。    
9、给出一个函数来输出一个字符串的所有排列。    
10、请编写实现malloc()内存分配函数功能一样的代码。    
11、给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。    
12、怎样从顶部开始逐层打印二叉树结点数据?请编程。 

解:

1. 链表的特点是修改方便,读取麻烦。数组反之。

 

2. 插入排序法,即从现有链表中(链表A)按顺序逐个取出元素,将他们插入另一个链表(链表B)。而在插入新链表时,首先假设待插入的链表(链表B)是已排序的,且插入后不改变排序状态。(简单举例:从第一个元素开始找,找到第一个大于自己的元素,将自己插在这个元素前面)选择原因:实现简单,空间优化(不需申请新的内存),时间复杂度可接受(最坏情况下比较的次数为:0+1+2+3+...+n-1 = n*(n+1)/2)

 

3. 冒泡排序算法。从前向后,找到相邻两个元素,后面比前面小的,则交换两个元素的位置,如此往复,直到找不到为止,选择的原因:实现简单,不容易写错。时间复杂度可接受,最坏情况下需要N-1次排序。代码如下:

 

 

4. 递进式的比较方法。

 

 

5. 网上搜到的解答基本都是介绍异或的高级用法。实际上算不上时间优化和真正意义上的空间优化。我认为可以通过如下办法优化(以下假设在32位CPU上运行程序):将长字符串的头尾分别以4字节一组进行反转,中间不足4字节的部分简单反转即可。

按组反转的思路:将头尾各四字节读入两个通用寄存器A,B,对于A,使用一个移位寄存器C与它配合,通过5次移位和4次安位或操作,将A的内容按字节反转到C上。同理处理B,反转到D上。然后将D的内容写入头部内存地址,C的内容写入尾部内存地址。

这样实现8个字节的反转,共有2次读内存,2次写内存,10次移位操作,8次或操作。

相比直接访问内存的办法:8字节有8次读操作,8次写操作。

具体那种方法快,我还没有定量分析过。

 

6. 定义两个指针,同时使用步长1和步长2遍历链表,如果有环,则两个指针都会进入环中,而最终它们会相遇。

 

原创粉丝点击