题目一
设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为(D)。
A.r-f
B.r-f+1
C.(r-f) mod n +1
D.(r-f+n) mod n
解释:
注意本题的索引下标是从1开始 所以循环队列中最多有n个元素
在循环队列中,头指针指向队列当中的第一个元素,而尾指针指向最后一个元素的下一位
假设循环队列的队尾指针是rear,队头是front,其中QueueSize为循环队列的最大长度。
(1) 入队时队尾指针前进1:(rear+1)%QueueSize
(2) 出队时队头指针前进1:(front+1)%QueueSize
(3) 队列长度:(rear-front+QueueSize)%QueueSize
现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为?(假设队头不存放数据)
答案:(rear-front+N)%N
(4) 队空和队满的条件
为了区分队空还是堆满的情况,有多种处理方式:
方式1: 牺牲一个单元来区分队空和队满,入队时少用一个队列单元,即约定以"队头指针在队尾指针的下一位置作为队满的标志"。
队满条件为:(rear+1)%QueueSize==front
队空条件为:front==rear
队列长度为:(rear-front++QueueSize)%QueueSize
方式2: 增设表示队列元素个数的数据成员size,此时,队空和队满时都有front==rear。
队满条件为:size==QueueSize
队空条件为:size==0
方式3: 增设tag数据成员以区分队满还是队空
tag表示0的情况下,若因删除导致front==rear,则队空;
tag等于1的情况,若因插入导致front==rear则队满
题目二
数组A=array[1..100,1..100]以行序为主序存储,设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]应为。
解释:
[(5-1)*100+(5-1)]*2+10=818,第一个5表示以行为序列,所以要使用列中的5,而不是使用行中的5,即使用A[5][5]中的第二个5,即(5-1)*100(这里的100表示列,相当于A[100][100]中的第二个100,),因为行和列都是从1开始,所以行和列都要-1,每个数据元素占2个存储,所以行和列都要*2,基地址为10,意思为首地址为10,所以选818
在Visual C++和Mingw64平台
short a[100],sizeof(a) 返回什么
解释:
short int : 2个字节
sizeof 返回的值表示的含义如下(单位字节):
数组 —— 编译时分配的数组空间大小;
指针 —— 存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为 4 );
类型 —— 该类型所占的空间大小;
对象 —— 对象的实际占用空间大小;
函数 —— 函数的返回类型所占的空间大小。函数的返回类型不能是 void 。
题目四
声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是()
(int *p[10])(int*)
int [10]*p(int *)
int (*(*p)[10])(int *)
int ((int *)[10])*p
以上选项都不正确
解释:
首先题目说要声明一个数组指针, 一般我们想到的数组指针是 随便来一个 int(*p)[10], 然后又说每个元素是一个函数指针,那么我们随便来一个 函数指针 int (*pf)(int *) . 然后把(*p)[10]作为一个整体替代 pf 即 int(*(*p)[10]))(int *); 分析: 判断一个复杂式子看最高优先级的,*p是一个指针,然后(*p)外面是[],所以是数组指针,(*p)[10])描述完毕,然后再看外面int(*)(int *)很明显,这是一个函数指针,所以这个数组中每个元素是函数指针
题目五
解释:
s是数组名,const指针,不可变;p是可变指针 B. s字符数组的内容是"china\0";p字符指针中的内容是'c'的地址,指向的内容为'c' C. p字符指针根本流不指向字符串
题目六
解释:
在区间 [1, 30] 中,
能被2整除的数有 30 / 2 = 15 个,
能被3整除的数有 30 / 3 = 10 个,
能被5整除的数有 30 / 5 = 6 个,
能被2整除也能被3整除的数有 30 / 6 = 5 个,
能被2整除也能被5整除的数有 30 / 10 = 3 个,
能被3整除也能被5整除的数有 30 / 15 = 2 个,
能被2整除、能被3整除也能被5整除的数有 30 / 30 = 1 个,
根据集合的容斥定律可知:A∪B∪C = A + B + C - A ∩ B - B ∩ C - A ∩ C + A ∩ B ∩ C,
因此,能被2整除或能被3整除或能被5整除的数的个数(不重复)为: 15 + 10 + 6 - 5 - 3 - 2 + 1 = 22
1500 / 22 = 68 ··· 4,[ 1, 30] 中,第4个满足条件的数是 5 ,而 68 * 30 = 2040, 因此第1500个数为
2040 + 5 = 2045
题目七
解释:
1. 定义一维数组时,必须显式指明数组的长度;
2. 定义***数组时,其一维数组的长度必须首先指明,其他维数组长度可以稍后指定;
3. 采用给定值初始化数组时,不必指明长度;
4. “[]” 是数组运算符的意思,在声明一个数组时,数组运算符可以放在数据类型与变量之间,也可以放在变量之后。
题目八
解释:
A忽视了线性表中的第一个元素和和最后一个元素 b,线性表的长度为零时,叫空表 c,按顺序排序的应该是线性表中的特例有序表,不能以偏概全
题目九
解释:
sort() 方法用于对数组的元素进行排序,参数决定排序的顺序。
题目十
解释:
sizeof计算长度包括字符串结束符\0
strlen不包括
题目十一
解释:
a11
a21 a22
.
.
a71, a72... a77
以此类推.
那么a11到a77一共有(1+7)*7/2=28个.
a81到a85是5个
所以就是33
题目十二
解释:
注意题目强调的是用 数组 实现的线性表,所以A答案就是访问数组的第i和i-1个元素,B和C是对数组进行插入和删除,需要移动后面的元素,复杂度为O(n)
题目十三
解释:
A[2][2]与A[0][0] 相差两排零2个元素
A[3][3]与A[2][2] 相差一排零1个元素
因为元素的地址是连续的
所以A[2][2]与A[0][0] 的地址差是A[3][3]与A[2][2]地址差的2倍
A[2][2]与A[0][0] 的地址差是676-644
A[3][3]与A[2][2]地址差是(676-644)/2
所以A[3][3]的地址是676+(676-644)/2
题目十四
解释:
float一般为4个字节,以0做下标,计算第15个则不包括第15个,所以只有15个
15*4+200=260,
题目十五
解释 :
线性表长度的定义是它所包含的元素的个数。元素的类型决定了元素所占用存储空间的大小,但元素的个数不等价于元素的类型。
题目十六
解释:
二维数组存储方式可以分为行优先和列优先俩种,所以数组的地址计算和数组的存储方式有关。
题目十七
解释:
数组A[10][5]由十行五列组成,所以A[i][j]的地址就为行数乘以每一行的列数5再加上j。
题目十八
解释:
p+=2的意思是:p=p+2 *(p++)意思是,取指针p所指向的对象内容,然后将指针后移一位。
题目十九
解释:
A00的n为1放在M[0] A11的n为2放在M[2] 以此类推A55的n为6放在M[20] A64为第七行的第5个数,所以在M[25] 或者A66放在M[27],往前数两个就是A64的位置。
题目二十
解释:
选项一角标越界,选项二,四格式不对 。
题目二十一
解释:
一行有m个元素,一列有n个元素,列优先应该是a00+jm+i 。
题目二十二
解释:
实际求的是对角线A[i][i]前面有多少元素,从0行开始到第i行是递增序列
等差数列求和公式:Sn=na1+n(n-1)d/2 经过代入整理得出:i(i+3)/2+1个元素,由于从0开始存储,所以i(i+3)/2,最终选A。
题目二十二
解释:
线性是线性,顺序是顺序,线性是逻辑结构,顺序是存储结构,两者不是一个概念,线性是指一个元素后继只有唯一的一个元素或节点,非线性是一个元素后面可以有多个后继或前继节点,顺序是指存储结构连续,例如数组是顺序的,链表不是顺序的,但他们都是线性的。当然顺序也可以是非线性的,例如顺序结构存储非线性结构的二叉树!!!
题目二十三
解释:
二维以上的数组其实是一种特殊的广义表。
题目二十四
解释:
二维数组可以理解为一维的一维,一维数组是线性表,那二维数组就可以看成数据元素为线性表的线性表了,栈是先进后出,队列是先进先出。
题目二十五
解释:
假设长度为n数组a, 从数组最前(插到a[0]前)到最后(插到a[n-1]后)共n+1种情况,分别需要移动n,n-1,...,0次,每种情况等概率P=1/(n+1), 期望为(n+n-1+...+0)/(n+1) = (1+n)*n/2/(n+1)=n/2。
题目二十六
解释:
1、后半句不正确。顺序存储在查询时效率高于链式,所以不存在谁比谁好,只是适用情况不同。
2、因果关系不正确。前半句对,顺序存储在插入和删除时效率低,但这并不是后半句成立的理由,况且后半句不成立。
题目二十七
解释 :
新的元素替换掉了原来在i的元素,原先在i位置上的元素以及后面元素都往后移,所以需要 + 1 。
题目二十八
解释:
就是行优先,先存行,所以第一行先存了n个,然后是第二行,n个,所以是b
题目二十九
解释:
题目三十
解释:
首先要理解为穿越问题。然后如下分析:
所有球离开的最长时间,就可以等效为最后离开的那个球的时间,也就变成找哪个球离左边或右边出口的距离最远,显然5个球中,第一个球离右端出口(33-3)30是距离最远的,故最后答案是30;
若求最短时间,同上,找每个球离左右出口最小的值中的最大值即可。最后是(33-19)14 。