牛客选择题归纳

题目一

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

题目十五

解释 :

线性表长度的定义是它所包含的元素的个数。元素的类型决定了元素所占用存储空间的大小,但元素的个数不等价于元素的类型。
题目十六

 解释:

二维数组存储方式可以分为行优先和列优先俩种,所以数组的地址计算和数组的存储方式有关。

题目十七

解释:

数组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行是递增序列

  • 第0行,一个元素
  • 第1行,两个元素
  • 第2行,三个元素
  • ……第i行,i+1个元素

等差数列求和公式: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 。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值