1. 数组 Q[n] 用来表示一个循环队列,front 为队头元素的前一个位置,rear 为队尾元素的位置,计算队列中元素个数的公式为( ) 。
注意一下细节,我已经加粗了。自己列式子的时候为了避免多1或者少1,自己画图模拟一下
分情况讨论一下:
(1)当 front <= rear, 则答案直接就是 (rear - front)
(2)当 rear < front, 答案为 n - (front - rear) = rear - front + n
合成一条式子就是 (rear - front + n) % n
2. 二维数组 A 中行下标是 10~20,列下标是 5~10,按行优先存储,每个元素占 4 个存储单元,A[10][5]的存储地址是 1000,则元素 A[15][10] 的存储地址是( )。
数组 A 中每行共有 6 个元素,元素 A[15][10]的前面共存储了(15-10)×6+5 个元素, 每个元素占 4 个存储单元,所以,其存储地址是 1000+140=1140。
元素个数别算错了,这种计算最怕多算1个少算1个。
3. 一个 n×n 的对称矩阵,按列优先进行压缩存储,则其存储容量为( )。
对于对称矩阵,行优先和列优先,其存储容量是一样的,1+2+…+n = n (n+1)/2。
4. 带头结点的循环链表 L 为空表的条件是 ( )。
那么空表就长下面这样:
所以答案为: L->next=L
5. 对于由 n 个元素组成的线性表,建立一个单链表的时间复杂度是 ( )。
答案: O(n) 。但当时我写了 O(n^2),原因是我认为单链表不知道尾指针,每次添加元素都要遍历到最后找到尾指针。
6. 在一个单链表中,已知 q 所指结点是 p 所指结点的直接前驱,若在 q 和 p 之间插入 s 所 指结点,则需要执行下列操作: ?
q->next=s; s->next=p;
这题为了描述清楚,导致信息有点冗余,思路是这样,但不一定要写得跟答案一样
7. 已知一个栈的进栈序列是 1,2,3,…,n,其输出序列是 p1,p2,…,pn,若 p1=n, 则 pi 的值是() 。
当 p1=n 时,输出序列是唯一的,即为 n、n-1、…、2,1!
想想为什么?没有其他情况了?别想太复杂了(
被书本给整蒙了?)。n是最后一个进栈的,却是第一个出栈,这也就是说:在轮到n入栈时,前面没有任何一个数出栈。在n-1入栈时,前面也没有任何一个数出栈...那么再正过来想,1进去后就留在栈中不出来,2进去也留在栈中不出来...,最后n进去。所以出栈序列刚好是反的。则 p2=n-1,…,pn=1,推断出 i=n-i+1
8. 设目标串为 s=“abcabababaab”,模式串为 p=“babab”,则 KMP 模式匹配算法的 next 数组为 ?
答案: {-1,0,0,1,2}
9. 下列求解汉诺塔问题的递归程序,其时间复杂度为 ()。
void hanoi(int n, char a, char b, char c)
{
if(n==1)
cout<<”a-c”;
else
{
hanoi(n-1,a,c,b);
cout<<”a-c”;
hanoi(n-1,b,a,c);
}
}
由代码可推出这两条式子:,。
现在问题是:求。
是不是很熟悉?高中数列时做过很多吧?已知递推式和第一项,求通项。
构造一个等比数列,
T(n) + 1 = 2 ( T(n-1) + 1 ) (注意此递推式成立的条件为 n>=2)
那么数列 { T(n) + 1 } (n>=2) 为首项为 T(2)+1 = 4,公比为2的等比数列
即 : 4 , 8 , 16 .... 第n-1项(可通过等比数列的通项公式求出)
| | | |
T(2)+1 , T(3)+1, T(4)+1 ... 第n项为T(n)+1
(注意上面的一一对应,可看出T(n)+1等于我们所构造的等比数列的第n-1项!!!别搞错了)
所以T(n) + 1 = 2 * 2^(n-1)
所以T(n) = 2^n - 1 (n>=2)
当n=1时,亦满足上式。
故T(n) = 2^n - 1 (n>=1)
所以用大O记表示就是O(2^n) (忽略系数和其他项)
10. 已知单链表中各结点的元素值为整数且递增有序,设计算法”DeleteBetween”删除链表中 所有大于 mink 且小于 maxk 的元素,并释放被删结点的存储空间( )。
what??课堂上,一支笔,一张纸,手写链表?我哭了。。细节太多,不调试估计很多人写出来都是有问题的
本人写的代码 (传送门)
我发现我没写析构函数,强迫症患者表示有点难受。不管了,懒得改了。