牛客选择题归纳

题目一

设循环队列中数组的下标范围是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,

发布了12 篇原创文章 · 获赞 1 · 访问量 220

猜你喜欢

转载自blog.csdn.net/Yi_nian_yu_dian/article/details/104464717