牛客网试题+答案分析+大牛面试经验(10)

一、假设有两个串 A 和 B ,求 B 在 A 中首次出现的位置的操作,我们称为( )。

A、连接
B、模式匹配
C、求子串
D、求串长
答案:B
解析:模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。
假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如
果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。

二、下面函数的功能是

int fun (char *s)
{
    char *p=s;
    while(*p++);
    return p-s-1;
}
A、计算字符串的位(bit)数
B、复制一个字符串
C、求字符串的长度
D、求字符串存放的位置
答案:C
解析:
int fun (char *s)//此处可知,返回值类型为整形int;
{
    char *p=s; //将s的值赋值给p,即p和s同指向某一个地址;
    while(*p++);//这条语句为这道题的坑,即循环体是分号。。。只要(*p++) != 0,就一直向后移动,直至p指向字符串末尾的"\0";
    return p-s-1;//此时,p指向字符串的末尾(\0的位置),s指向字符串的头,则,p-s-1就是字符串的长度,-1就是去掉"\0"的长度1
}

三、设有两个串S1和S2,求S2在S1中首次出现的位置的运算称作()

A、求子串
B、判断是否相等
C、模型匹配
D、连接
答案:C

四、以下程序段的输出结果是

char s[]="\\123456\123456\t";
printf("%d\n",strlen(s));
A、12
B、13
C、16
D、以上都不对
答案:A
解析:这里考查转义字符,注意 \\ 表示字符 \
\123表示字符 {
\t 表示制表符
这些都是一个字符;
所以共12个字符。
知识拓展:char s[] = "//123456/123456/t"; 这样strlen(s)输出17个字符。

五、线性表中每一个元素都有一个前驱和一个后继

A、错
B、对
答案:A
解析:线性表中第一个元素没有前驱,最后一个元素没有后驱。

六、在一个单链表中,若删除 P 所指结点的后续结点,则执行?

A、p = p->next;p->next = p->next->next;
B、p->next = p->next;
C、p->next = p->next->next;
D、p = p->next->next
答案:C
解析:其中p->next 相当于指向了下一个元素,p->next->next相当于指向了第二个元素,这样将第二个元素赋值给第一个元素,
这样就i相当于单链表中删除P所指向的后续节点。

七、带头结点head的单向循环链表L为空的判断条件是( )

A、head==NULL
B、head->next==NULL
C、head->next==head
D、head!=NULL
答案:C
解析:  单向不带头结点链表 判空: head==NULL
	    单向带头结点 :          head->next=NULL
		单向循环不带头结点 :     head==NULL
		单向循环带头结点 :       head->next=head

八、双向链表中有两个指针域,llink和rlink分别指向前驱和后继,设p指向链表中的一个结点,现要求删去p所指结点,则正确的删除是()(链中结点数大于2,p不是第一个结点)

A、 p->llink->rlink:=p->llink;
	p->llink->rlink:=p->rlink;
	dispose(p);
B、 dispose(p);
	p->llink->rlink:=p->llink;
	p->llink->rlink:=p->rlink;
C、 p->link->rlink:=p->llink;
	dispose(p);
	p->llink->rlink:=p->rlink;
D、 以上A,B,C都不对
答案:D
解析:	首先要更新p结点前后结点的指针域,然后再删除P.正确做法是
		p->llink->rlink=p->rlink;
		p->rlink->llink=p->llink; 
		dispose(p);

九、用不带头结点的单链表存储队列,其头指针指向队头结点,尾指针指向队尾结点,则在进行出队操作时 。

A、仅修改队头指针
B、仅修改队尾指针
C、队头、队尾指针都可能要修改
D、队头、队尾指针都要修改
答案:C
解析:我们这里需要考虑队列中只有一个元素的特殊情况。

十、对一棵二叉排序树进行____________遍历得到的结点序列是一个有序序列。

A、前序
B、中序
C、后序
D、层序
答案:B
解析:二叉排序树被称为二叉搜索树,也叫做二叉查找树。
二叉排序树或者是一个空树,也或者是以下性质的二叉树:
1、若他的左子树不为空,那么他的左子树的所有结点的值均小于根节点的值
2、若他的右子树不为空,那么他的右子树的所有结点的值均大于根节点的值
这样看来我们得中序遍历是一个顺序序列。

十一、不同的求最小生成树的方法最后得到的生成树是相同的. ()

A、正确
B、错误
答案:B
解析:最小生成树不唯一,但是最小生成树得权值之和是唯一的,并且是相等的。

十二、已知一棵有2011个结点的树,其叶结点个数为116,该树对应的二叉树无右孩子的结点个数为

A、115
B、116
C、1895
D、1896
答案:D
解析:转换出来的二叉树中,一共有2011*2个链域,其中左右链域各2011个。
设非空的左链域有XL个,非空的右链域有XR个,那么XL+XR+1=2011(总节点数为根节点加左右孩子数)
且因为二叉树是由树转化而来,因此节点在树中至少要有一个孩子才能在转化为二叉树后有左孩子(也就是非叶节点),
也就是说有2011-116个节点在二叉树中有左孩子,因此XL=2011-116,代入上式可得2011-116+XR+1=2011,因此XR=115。
由此, 空的右链域=2011(右链域数)-XR=1896个,得解

十三、在9阶B-树中,除叶子以外的任意结点的分支数介于5和9之间()

A、对
B、错
答案: B 
解析:![在这里插入图片描述](https://img-blog.csdnimg.cn/20190509085618746.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L04xMzE0Tg==,size_16,color_FFFFFF,t_70)

十四、在面向对象的程序设计中,关于数组,下列说法正确的有

A、数组属于一种原生类
B、数组是一种对象
C、int number=[]={31,23,33,43,35,63}
D、数组的大小可以任意改变
答案:B
解析:A.原生类指未被实例化的类,数组一般指实例化,被分配空间的类,不属于原生类.
B.对象的特点是封装了一些数据,同时提供了一些属性和方法,从这个角度来讲,数组是对象
C.格式有误
D.数组的大小确定之后不可改变

十五、定义语句"double * array [8]"的含义正确的是()。

A、array是一个指针,它指向一个数组,数组的元素时是双精度实型
B、array是一个数组,数组的每一个元素是指向双精度实型数据的指针
C、C语言中不允许这样的定义语句
D、以上都不对
答案:B
解析:指针数组( * stings[] ):可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,
意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。
数组指针( (*strings)[] ):可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思
是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。

十六、循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是 。

A、队空:end1 == end2;                                  队满:end1 == (end2+1)mod M
B、队空:end1 == end2;                                  队满:end2 == (end1+1)mod (M-1)
C、队空:end2 == (end1+1)mod M;     队满:end1 == (end2+1)mod M
D、队空:end1 == (end2+1)mod M;    队满:end2 == (end1+1)mod (M-1)
答案:A
解析:end1指向队头元素,那么可知出队的操作是先从A[end1]读数,然后end1再加1。end2指向队尾元素的后一个位置,那么可知入队操作
是先存数到A[end2],然后end2再加1。若把A[0]储存第一个元素,当队列初始时,入队操作是先把数据放到A[0],然后end2自增,即可知end2
初值为0;而end1指向的是队头元素,队头元素的在数组A中的下标为0,所以得知end1初值也为0,可知队空条件为end1==end2;然后考虑队
列满时,因为队列最多能容纳M-1个元素,假设队列存储在下标为0到下标为M-2的M-1个区域,队头为A[0],队尾为A[M-2],此时队列满,考虑
在这种情况下end1和end2的状态,end1指向队头元素,可知end1=0,end2指向队尾元素的后一个位置,可知end2=M-2+1=M-1,所以可知队
满的条件为end1==(end2+1)mod M,选A。

十七、两个栈共用静态存储空间,对头使用也存在空间溢出问题()

A、对
B、错
答案:A
解析:既然是静态空间,大小就是事先确定的。所以存在空间溢出的问题

十八、下 列数据结构中, ( )是非线性数据结构。

A、栈
B、队列
C、二叉树
D、堆
答案:C
解析:二叉树是非线性数据结构,堆是一种特殊的数据结构的统称,可以看成是一棵树

十九、若栈采用顺序存储方式存储,现两栈共享空间v[1…m],top[i]代表第i个栈(i=1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()

A、|top[2]-top[1]|=0
B、top[1]+1=top[2]
C、top[1]+top[2]=m
D、top[1]=top[2]
答案:B
解析:m1和m2如果不相邻,那么要么S[1]还可以允许元素入栈,要么S[2]允许;
只有m1 + 1 = m2时,没有多余的空间允许更多元素入栈,此时栈满。

你可能感兴趣的:(牛客专题)