数组、链表、字符串错题集锦

来源:互联网 发布:nba2k16帅气捏脸数据 编辑:程序博客网 时间:2024/05/20 04:11

1、链表的结点信息包含数据域和指针域,相同数据下,数组的大小是链表大小的子集。


2、广义表的表头为空,则此广义表亦为空表。(错)

分析:广义表的表头为空,并不代表该广义表为空表。

例如:

广义表()(())不同。前者是长度为0的空表,对其不能做求表头和表尾的运算;而后者是长度为l的非空表(只不过该表中惟一的一个元素是空表),对其可进行分解,得到的表头和表尾均是空表()

 

一个非空广义表的表头可以是原子或者是子表。

 

3、int a[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;其中0<=i<=9.则对a数组正确引用:

A a[p-a] //指针是有减法的,不过只在数组之中应用,用来表示元素个数的差,这里pa其实是相等的。数组名就是数组首地址,此时pa相等,即[p-a]就是a[0]

B *(&a[i]) //相当于a[i]

C p[i]//相当于p+i,指向数组a[i]的指针

D a[10]//数组下标范围0~9

 

4二维数组的定义方式:

1). int [][] array =new int[n][m];

2).int [][]array={{1,2,3,4},{1,2,3,4},{1,2,3,4}};

方式一:定义二维数组可以指定不定义行,但是必须定义列。

 

5、邻接表是图的一种顺序存储结构(错误)


6十字链表(Orthogonal List)是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。

 

7用邻接表表示图进行深度优先遍历时,通常采用来实现算法;DFS用栈,BFS用队列)

 

8、静态链表中指针表示的是:数组下标。(静态链表,数组的每一个下标都对应一个data和一个cur   数据域data用来存放数据元素,而游标cur相当于单链表中的next指针)

 

9、双向链表中有2个指针域,llinkrlink,分别指向前驱和后继,设p指向链表中的一个结点,q指向一待插入结点。现要求在p之前插入q,正确插入为:

(1)q->llink=p->llink;p->llink->rlink=q; q->rlink=p; p->llink=q;

(2)p->llink->rlink=q;q->rlink=p; q->llink=p->llink; p->llink=q;

 

10、在一个带头结点的单链表HL中,若要在第一个元素之前插入一个由指针p指向的结点,则执行:

注意:头指针不是第一个元素,仅仅是一个标志。第一个结点之前是头结点,头指针指向头结点。第一个元素之前有一个头指针。首先p->next = HL->next;再将头指针指向当前的首个元素HL->next = p;

 

11、链式存储结构是在计算机中用一组任意的存储单元存储线性表的数据元素。链式存储比顺序存储结构的存储密度小(每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话,顺序比链式存储更多。)

 

12、哈希表难以实现顺序遍历,哈希表是离散的。哈希表几乎可以实现随机存取。

 

13ArrayList的大小是可以改变的,是基于数组实现的,往ArrayList里添加数据时,会首先判断数组大小是否已满,如果满则扩充数组,其实就是新建一个数组,然后把数据拷贝过去。ArrayList插入或删除一个元素的开销不是固定的。

LinkList是双向的。

 

14如果使用比较高效的算法判断单链表是否有环,至少需要2个指针。(一个每次走一步,一个每次走2步,会相遇就表示有环)

分析:判断是否有环,可以用快慢指针来实现。两指针移动速度不一样,如果相遇则表示有环,否则表示无环。

 

15、设一个链表最常用的操作就是在末尾插入结点和删除尾结点,则选用带头结点的双循环链表最节省时间。

分析:首先总在末位操作。所以使用循环链表。又因为要执行删除操作。若使用单循环链表,例如对....->X->Y>Z->...,Y删除后无法一步访问X。若双循环链表,可向回访问。

 

某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间,选的答案是:带尾指针的单循环链表

 

16、子串:串中任意连续的字符组成的子序列。

 

17、关于KMP算法:效率不一定比普通算法高;next值与主串没有关系;计算next值时,模式串可以看做主串;


补充:

部分匹配表:

前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合;

"部分匹配值"就是"前缀""后缀"的最长的共有元素的长度。"ABCDABD"为例,

"A"的前缀和后缀都为空集,共有元素的长度为0

"AB"的前缀为[A],后缀为[B],共有元素的长度为0

"ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0

"ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0

"ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1

"ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2

"ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0

 

kmp算法:

1后移, 直到字符串有一个字符,与搜索词的第一个字符相同为止.

2接着比较字符串和搜索词的下一个字符,直到字符串有一个字符,与搜索词对应的字符不相同为止

3根据部分匹配表,移动位数 =已匹配的字符数 - 对应的部分匹配值

 逐位比较,直到搜索词的最后一位

原创粉丝点击