牛客选择题归纳
题目一
设循环队列中数组的下标范围是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]应为。
- 1020
- 1010
- 818
- 808
解释:
[(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) 返回什么
- 2
- 4
- 100
- 200
- 400
解释:
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() 方法用于对数组的元素进行排序,参数决定排序的顺序。
- 原数组var array=[-1,1,3,4,6,10];
- 参数(a,b)=>Math.abs(a-3)-Math.abs(b-3):即数值减3的绝对值[4,2,0,1,3,7]作为参数决定排序。
- 根据绝对值减3大小排列[0,1,2,3,4,7],对应的原数组排序后为[3,4,1,6,-1,10]
题目十
解释:
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,