2022.10.28-牛客-Java数组专项练习

2022.10.28-Java数组专项练习

1、在定义int a[3][4][2];后,第20个元素是( A )。

A. a[2][1][1]
B. a[1][0][1]
C. a[2][0][1]
D. a[2][2][1]

解析:
三维数组可以看成是一本书!
int a[3][4][2]; 就是有3页,每页有4行2列

(多选)2、下列关于线性表中的链表描述正确的是?( A、B、C、D

A. 适用于数据项数量不能预知的情况。
B. 逻辑相邻的2个元素的存储空间可以是不连续的。
C. 链表节点一般有数据元素和指针域两部分组成。
D. 存储空间需要动态分配

3、线性表L = {a1,a2,…,an}, 下列陈述正确的是( D )。

A. 每个元素都有一个直接前驱和一个直接后继
B. 线性表中至少有一个元素
C. 表中诸元素的排列必须是由小到大或由大到小
D. 除第一个和最后一个元素外,其余每个元素都有且仅有一个直接前驱和直接后继

解析:
选项A中,忽略了线性表中的第一个和最后一个元素
选项B中,线性表的长度为0时,叫空表
选项C中,按顺序排序的是线性表中的特例有序表,不能以偏概全

4、假设以数组Data[0…m-1]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( A )。

A. (rear-front+m)%m
B. rear-front+1
C. (front-rear+m)%m
D. (rear-front)%m

解析:
循环队列的相关条件和公式:
队尾指针是rear,队头是front,其中QueueSize为循环队列的最大长度

1、队空条件:rear == front
2、队满条件:(rear + 1)%QueueSize == front
3、计算队列长度:(rear - front + QueueSize)%QueueSize
4、入队:(rear + 1)%QueueSize
5、出队:(front + 1)%QueueSize

5、若有语句

char s1[10], s2[10] = {"books"};

则将字符串books存放在数组s1的正确语句是( A )。

A. strcpy(s1, s2);
B. s1 = {“books”};
C. s1 = s2;
D. strcpy(s2, s1);

解析:
s1是数组名,数组名代表的是数组的首地址,是一个地址常量,所以不能给数组名赋值

6、线性表采用链式存储时,其地址( D )。

A. 必须是连续的
B. 一定是不连续的
C. 部分地址必须是连续的
D. 连续与否均可以

解析:
线性表包括顺序表和链式存储表。
链式存储 指用一组任意的(可以连续也可以不连续)存储单元存储线性表中的数据元素,它的内存可以是连续的也可以是不连续的,
顺序表的内存必须是连续的。

7、执行以下代码段(程序已包含所有必需的头文件)会输出什么结果( D )。

char a[3];
char b[] = "good";
a = b;
printf("%s",a);

A. go
B. goo
C. good
D. 编译出错

解析:
a和b都是数组名,数组名代表的是数组的首地址,无法相互赋值

8、以下程序段的运行结果是( B )。

char str[10] = "output";
printf("\"%s\"\n",str);

A. output
B. “output”
C. \“output\”
D. 编译错误

解析:
printf中%s前后的“ \" ”是转义字符

9、若二维数组a有m列,则计算任一元素a[i][j]在数组中的位置公式为( D )。(假设a[0][0]位于数组的第一个位置上)

A. im + j
B. j
m + i
C. im + j - 1
D. i
m + j + 1

解析:
很简单的直接把i=0,j=0代入,只有D选项为1
注意: 题目问的是位置,不是存储位置

(多选)10、线性结构的是( A、B、C )。

A. 串
B. 链式存储栈
C. 顺序存储栈
D. 顺序存储二叉树

解析:
线性是线性,顺序是顺序,线性是逻辑结构,顺序是物理存储结构,两者不是一个概念。
线性是指一个元素后继只有唯一的一个元素或节点,非线性是一个元素后面可以有多个后继或前驱节点;
顺序是指存储结构连续,例如数组是顺序的,链表不是顺序的,但他们都是线性的。当然,顺序也可以是非线性的,例如顺序结构存储非线性结构的二叉树。
如:数组和链表逻辑上是连续的,但数组在物理上分配了一块连续的内存,而链表内存地址是非连续的,通过指针寻找下一个节点。

(多选)11、以下关于链表和数组说法正确的是( A、C )。

A. new出来的数组也在堆中
B. 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)
C. 数组利用下标定位,时间复杂度O(1),链表定位元素时间复杂度O(n)
D. 对于add和remove,ArrayList要比LinkedList快

解析:
选项A中,堆内存是用来存放由new创建的对象和数组;栈内存是用来存放在函数中定义的一些基本类型的变量和对象的引用变量
例如:new函数和malloc函数申请的内存在堆中,
  局部变量存放在栈;函数调用参数,函数返回值,函数返回地址存放在栈。
选项B中,链表与数组的插入和删除时间复杂度都是O(n)
选项C中,数组利用下标index定位,时间复杂度O(1)(无论有序数组还是无序数组);链表定位元素时间复杂度O(n)(最好情况下第一个就是即O(1),最坏情况O(n),取最坏情况O(n))
选项D中,数组:查询速度快,增删元素慢;链表:查询速度慢,增删元素快。

(多选)12、下列说法正确的是( A、B、D )。

A. 二维以上的数组其实是一种特殊的广义表
B. 数组一旦建立,结构的元素个数和元素间的物理存储关系就不再变化
C. 数组是一种线性结构,因此只能用来存储线性表
D. 数组采用顺序存储方式表示

解析:
对于选项C,数组也可以用来存储完全二叉树

13、下列叙述中正确的是( A )。

A. 顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
B. 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
C. 顺序存储结构能存储有序表,链式存储结构不能存储有序表
D. 链式存储结构比顺序存储结构节省存储空间

解析:
1、链式存储结构既可以针对线性结构也可以针对非线性结构,所以B、C错误;
2、链式存储结构中每个结点都由数据域和指针域两部分组成,增加了存储空间,所以D错误。

扩展:
随机存取顺序存取随机存储顺序存储概念辨析
存取结构: 分为随机存取和非随机存取(又称顺序存取)
1、随机存取:就是直接存取,可以通过下标直接访问的那种数据结构,与存储位置无关,例如数组 (array)。存取第N个数据时,不需要访问前 (N-1) 个数据,直接对第N个数据操作
2、顺序存取:即非随机存取。存取第N个数据时,必须先访问前(N-1) 个数据,不能通过下标访问,只能按照存储顺序存取,与存储位置有关,例如链表 (list)。
存储结构: 分为顺序存储和随机存储。
1、顺序存储:在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构。顺序存储结构是把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。通常顺序存储结构是借助于计算机程序设计语言 (例如c/c++)的数组来描述的。顺序存储结构特点:

1、节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间
2、可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。
3、不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。

2、随机存储:在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的。也可以是不连续的)。它不要求逻辑上相邻的元素在物理位置上也相邻,但也同时失去了顺序表可随机存取的优点。随机存储最典型的代表为链式存储。链式存储结构特点:

1、比顺序存储结构的存储密度小(每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)
2、逻强上相邻的节点物理上不必相邻。
3、插入、明除灵活(不必移动节点,只要改变节点中的指针)
4、查找结点时链式存储要比顺序存储慢。
5、每个结点是由数据域和指针域组成。

14、设有一个10阶对称矩阵A[10][10],采用压缩存储方式按行将矩阵中的下三角部分的元素存入一维数组B[]中,A[0][0]存入B[0]中,则A[8][6]在B[]的( C )位置。

A. 32
B. 33
C. 42
D. 65

解析:
0 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 6 + 1= 42

15、在以下哪些操作中,数组比链表更快?( D

A. 原地逆序
B. 头部插入
C. 返回头节点
D. 返回随机节点

解析:
数组给定下标能够直接寻址,指哪儿就是哪儿

16、假设要存储一个数据集,数据维持有序,对其的操作只有插入、删除和顺序遍历,综合存储效率和运行速度,下列哪种数据结构是最适合的?( B

A. 数组
B. 链表
C. 哈希表
D. 队列

解析:
数组: 最大的优势是支持随机访问,因为内存空间是连续的,但是,插入和删除是绝对短板,涉及到内存空间的申请与释放;而顺序遍历和链式存储的时间复杂度一样。
链表: 最大的优势就是插入和删除十分方便,我们可以在链表的任何位置通过修改指针的指向,从而向链表当中插入新的结点。随机访问的效率十分低,时间复杂度为O(n),而数组随机访问的时间复杂度为O(1)。但本题目中说的是顺序访问,二者的时间复杂度都是O(n)。
哈希表: 哈希表的底层实现是数组,因为计算出来哈希值,我们要快速索引到相应哈希值的位置。插入和删除操作,我不晓得高不高效,因为可能会出现存储上的冲突,此时就要执行冲突规避的方法。另外,顺序访问肯定也是比较复杂的,链表和数组直接无脑地下一位即可,但是哈希表得计算哈希值再由哈希值访问到相应的内存位置。
队列: 它的存储可以是连续或者离散的,我们得从队列的性质出发,它最大的特点就是只支持队尾插入和队头删除,这种操作模式比较死板,而链表则可以在任何位置进行插入及删除操作。顺序遍历可能都差不多,所以我们肯定是要选链表的。

*17、int (p)[3]中p的含义是什么?( B

A. 一个指向int且元素个数为3的指针数组
B. 一个指向元素个数为3的int数组的指针
C. 不合法
D. 以上说法都不正确

解析:
int (*p)[4]; p为指向含4个元素的一维整型数组的指针变量(是指针)
int *p[4]; 定义指针数组p,它由4个指向整型数据的指针元素组成(是数组)
int (*)[4]; 实际上可以看作是一种数据类型,也就是第一个(int (*p)[4]; )

18、设以下c语言中,对数组array定义后,数组元素array[1][2]的值为:( D

int array[2][3] = {1, 2, 3, 4, 5};

A. 2
B. 3
C. 5
D. 0

解析:
当进行了初始化这个动作,没有在初始化列表中初始化的元素统一赋值为0。

19、二维数组k[1…7,1…9],每元素大小占2个字节,而且使用列存储,a[5,4]的偏移量为( D )个字节。

A. 78
B. 39
C. 25
D. 50

解析:
( 7 * (4 - 1) + (5 - 1) ) * 2 = 50

20、若数组S[1…n]作为两个栈S1和S2的存储空间,对任何一个栈,只有当[1…n]全满时才不能进行进栈操作。为这两个栈分配空间的最佳方案是( C )。

A. S1的栈底位置为0,S2的栈底位置为n + 1
B. S1的栈底位置为0,S2的栈底位置为n / 2
C. S1的栈底位置为1,S2的栈底位置为n
D. S1的栈底位置为1,S2的栈底位置为1

解析:
两个栈的栈顶,一个在数组第一个元素,朝着数组索引增加方向增加,一个栈顶在数据最后一个元素,朝着数组索引减少方向增加;当两个栈的栈顶位置相差为1时,数组被写满。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值