专项训练【JavaSE(数组和列表)】

题目一

A.方便运算

B.方便存储

C.提高运算速度

D.减少存储空间

解析:选D

A C,都是运算方面的好处

B,如果邻接表,还要存指针,并没有方便存储

D,不管是,邻接矩阵还是邻接表,都节省了空间

题目二



正确

错误

解析:正确

考察的将矩阵(下半个三角部分)的元素依次按照每行的元素添加到数组中,求的是A64前面有多少元素。

A00

A01  A11

……

……A64

根据数列的计算:0+1+2+3+4+5+6+5个元素,结果为25个元素,所以A64对应M[25]。

题目三


A.BA+141

B.BA+180

C.BA+222

D.BA+225

 解析:选A

注意数组是从1开始算。(4*10+7)*3=141

题目四



A.4

B.5

C.9

D.10

解析:选A

strlen(str)求字符串的长度,遇到\0是结束计算,不算 \0,且从1开始计数。 1234\0所以长度为4。

题目五



A.s 和 p 完全相同

B.数组 s 中的内容和指针变量 p 中的内容相等

C.s 数组长度和 p 所指向的字符串长度相等

D.*p 和 s[0]值相等


解析:选D

A错,*p为一个指针,指针和字符串是不同的概念;

B错,数组s的内容是赋的值“china”,而p是char 指针,应该指向char型对象的地址,即s的地址

C不确定,但听起来就有点像错的,有可能是前面说的s数组的长度为6(包含结束符'\0'),p所指向的字符串长度为5,也可能是p指向的只是一个字符,长度是1??

D肯定对啦,*p是取地址指向的内容----char ‘c’,s[0]是指它的第一个字符‘c’。

题目六



A.没区别

B.行优先快

C.列优先快

D.2种读取方式速度为随机值,无法判断

 解析:选B

如果数组很大的话应该是行优先快,因为数组在内存中是按行优先存储的,在虚存环境下,如果整个数组没有在内存中的话可以比列优先减少内存换进换出的次数。就算整个数组都在内存中,列优先访问a[i][j]还得计算一次乘法,行优先只需加一就可以了,这个可以忽略。

题目七



A.120

B.150

C.100

D.80

 解析:选B

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20

就像上面的表格,每一个格子可以说成是一个长方形,算的时候就是求这些边的组合:

竖着取两条边,C(6,2)。横着取两条边C(5,2)

所以结果就是:C(6,2)*C(5,2)=15*10=150 

题目八



A.j=r[j].next

B.j=j+1

C.j=j->next

D.j=r[j]->next

   

解析:选A

首先链表的下一个结点应该用next指针访问,排除B

当前结点是r[j],可以排除C

r[j]是当前节点而不是指向当前节点的指针,因此用r[j].next

 题目九



A.数组从栈中分配空间,链表从堆中分配空间

B.数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)

C.数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n)

D.对于add和remove,ArrayList要比LinkedList快

解析:选ABC

单说数组有歧义,静态数组是在栈中开辟内存,链表一般是在堆中分配空间,静态链表除外

题目十



A.原地逆序

B.头部插入

C.返回中间节点

D.返回头部节点

E.选择随机节点

解析:ACE

A选项,如果是数组只要遍历一半元素就可以了,翻转的思想类似于字符串逆序,但链表如果要完成逆序,就算只是修改指针也要把所有的元素遍历完,所以相比而言数组还是比链表快的。

B链表只需插入一个节点,数组需移动n个元素

C选项的访问中间节点,数组可以通过array[length/2]访问,链表需要依次查找到中间节点。

D头结点都一样

E 数组是顺序存储的线性表,相对于链表而言主要的优点就是可以通过下标随机访问数组中的任意元素。

题目十一



180

720

120

540

解析:选A

简单的概率学

首先有6个位置

先排N ,U有6*5=30种

再排Y,Y只有4个坑了有4*3/2=6种

最后2个位置给O,O,所以总共30*6=180种.

题目十二



16902

16904

14454

以上答案均不对

解析:选A

第32行第58列的元素 表示为 a[   32,58   ] ,但是我们习惯写成a【31】【57】

首先,二维数组可以表示为A【60】【70】 (60行70列)

a[   31,57   ]

以列序为主: (57*60+31)*2+10000= 16902

以行序为主: (31*70+57)*2 +10000= 14454

题目十三



xyz123ABC

z123ABC

xy123ABC

出错

解析:选D

原代码有错:p1和p2都指向常量字符串,在常量区,所以不能对其进行操作;改为数组即可,但是用字符串初始化数组时要记得将数组长度加1,因为字符串默认的末尾有一个‘\0’;第二点要注意的是,strcat函数的p1要有足够的空间来容纳p1和p2连接后的串长。

修改为以下代码将可以:

char p1[7] = "123";

char p2[] = "ABC";

char str[50] = "xyz";

strcpy(str + 2, strcat(p1, p2));

printf("%s\n", str);

结果:

题目十四



"I love this game"

"I love thi"

"I love"

"I"

解析:选D

cin输入时遇到空格会结束,所以一般用getline作为字符串的输入(含空格)

题目十五



O(1)

O(log2n)

O(n)

O(n^2)

 解析:选C

我们使用头插式尾插式创建链表都只需要一次循环遍历就可实现,所以时间复杂度为O(n)

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作

题目十六



对

错

解析:选B

数组适合用于满二叉树和完全二叉树的存储结构。

题目十七



n-i,n-i+1

n-i+1,n-i

n-i,n-i

n-i+1,n-i+1

 解析:选A

删除第i个元素:(i-1为第i个元素)

0,...i-1,i,...n-1:移动i~n-1的元素个数=n-1-i+1=n-i

在第i个元素前插入元素:(i-1为第i个元素)

0,...,i-1,i,...,n-1:移动i-1~n-1的元素个数=n-1-(i-1)+1=n-i+1

题目十八



8 100

100 8

100 100

8 8

 解析:选A

string_a是一个char型的指针,在64位系统中sizeof(char*)=8

string_b是一个char型的数组,在64位系统中sizeof(char)=1,共100值因此为100

题目十九



(rear-front+m)%m

rear-front+1

(front-rear+m)%m

(rear-front)%m

 解析:选A

循环队列中元素个数计算方法是固定的,即(尾-头)%长度,但是由于是循环队列所以尾可能会小于头,所以要加上长度,使尾-头保持是正整数,然后再对长度求余,即元素个数

循环队列的相关条件和公式: 
队尾指针是rear,队头是front,其中QueueSize为循环队列的最大长度 
1.队空条件:rear==front 
2.队满条件:(rear+1) %QueueSIze==front 
3.计算队列长度:(rear-front+QueueSize)%QueueSize 
4.入队:(rear+1)%QueueSize 
5.出队:(front+1)%QueueSize

题目二十



a [] ="abcdefg";

a="abedefg";

*p="abcdefg";

p="abcdefg ";

 解析:选D

将字符串赋值给字符数组: ********************************************** 1.定义时直接用字符串赋值。 char a[10]="hello";但是不能先定义再赋值,即以下非法:char a[10];a[10]="hello"; ********************************************** 2.利用strcpy。 char a[10]; strcpy(a,"hello"); ********************************************** 3.利用指针。 char *p; p="hello";这里字符串返回首字母地址赋值给指针p。另外以下非法:char a[10]; a="hello"; a已经指向在堆栈中分配的10个字符空间,不能再指向数据区中的"hello"常量。可以理解为a是一个地址常量,不可变,p是一个地址变量。 ********************************************** 4.数组中的字符逐个赋值。

题目二十一



11

12

13

14

 解析:选c

哈弗曼树又叫做最优二叉树,是权值越大的点离根节点越近,导致整个树权值最小

方法:选择值最小的两个点作为左右节点,然后和作为父节点,在剩下的点以及父节点中选择最小的两个依次构造,形成哈弗曼树

左边数值是0,右边是1

哈弗曼编码是将各个点的值加起来最小

长度计算就是把各个点的值乘以路径长加起来

例a(3),b(2),l(1),i(1)

长度就是3(l+i)+2b+1a;把abli换成他们对应的3 2 1 1就是13

题目二十二



[(j-1)*n+i-1]*d

[(j-1)*n+i]*d

[(j-1)*n+i+1]*d

[(j-1)*n+i-2]*d

 解析:选A

11      
21 22    
31 32 33  
41 42 43 44
1      
2 3    
4 5 6  
7 8 9 10

对于上述A4x4矩阵,第一个矩阵标识该矩阵下标,第二个矩阵标识该矩阵中对应下标的元素应该保存在一维数组中的位置,保存下三角的一维数组为[0,10],令d=1

对于A.[(j-1)*n+i-1]*d,按列优先则计算结果依次为:0、1、5、2、6、10、3、7、11、15;

对于B.[(j-1)*n+i]*d,按列优先则计算结果依次为:1、2、6、3、7、11、4、8、12、16;

对于C.[(j-1)*n+i+1]*d,按列优先则计算结果依次为:2、3、7、4、8、12、5、9、13、17;

对于D.[(j-1)*n+i-2]*d,按列优先则计算结果依次为:-1、0、4、1、5、9、2、6、10、14;

所以实际答案应该为[i*(i-1)/2+j]*d

题目二十三



i*m+j

j*m+i

i*m+j-1

i*m+j+1

解析:D

位置和下标的区别,下标从0开始,位置从1开始

直接把a[0][0] 代入,即i = 0, j =0。只有i*m+j+1 = 1

题目二十四



每次分区后,先处理较短的部分

每次分区后,先处理较长的部分

与算法每次分区后的处理顺序无关

以上三者都不对

 解析:选A

在快速排序中,需要使用递归来分别处理左右子段,递归深度可以理解为系统栈保存的深度,先处理短的分段再处理长的分段,可以减少时间复杂度;

如果按长的递归优先的话,那么短的递归会一直保存在栈中,直到长的处理完。短的优先的话,长的递归调用没有进行,他是作为一个整体保存在栈中的,所以递归栈中的保留的递归数据少一些。

题目二十五



int ch<='9'  '0'

char   ch<='9'  '0'

char   ch<='9'  0

int ch<='9'  0

 解析:选AB

这题不严谨,AB输出结果都对。反正都要做类型转换,也无所谓哪个比较优

A、返回char,那么if条件里面做了隐式类型转换:int数字转成char

B、返回int,那么main中赋值给char变量的时候做了类型转换,int转char

1

2

3

4

5

6

int fun(char ch)

{

    if(ch>='0'&& ch<='9')

        return'9'-(ch-'0');

    return ch;

}

题目二十六



drop table book;

truncate table book;

delete from book;

del *from book;

解析:选AD

A: drop table book 是删除整个表,题目的潜在意思是删除表中的数据而并非删除整个表。因此A错。
B: truncate table book 是删除表中的数据,删除速度比delete更快,无法撤回(回退)。
C: delete from book  删除数据表中的数据,可以回退,可添加where 子句。
D:语法错误。

题目二十八



find

gzip

grep

sort

解析:选C

grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。 find只能匹配单个字符。

题目二十九



LOC(A[0][0])+(i*m+j)

LOC(A[0][0])+(i*n+j)

LOC(A[0][0])+[(i-1)*n+j-1]

LOC(A[0][0])+[(i-1)*m+j-1]

解析:选B

就是行优先,先存行,所以第一行先存了n个,然后是第二行,n个,所以是b

题目三十



scanf("%s", str);

str[] = getch();

gets(str);

str = gets();

解析:选C

gets(字符数组名或指针)

gets能够接受空格、制表符Tab和回车等。

gets和sacnf函数,在字符串接受结束后自动加'\0'

scanf不能输入空格

题目三十一



数组和链表都可以随机访问

数组的插入和删除可以 O(1)

哈希表没有办法做范围检查

以上说法都不正确

解析:选B

数组静态分配内存,链表动态分配内存;

数组在内存中连续,链表不连续;

数组元素在栈区,链表元素在堆区;

数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);

数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。

题目三十二



对

错

 解析:选B

非空的广义表中的元素或者是一个不可分割的原子,或者是一个非空的广义表,注意理解题目,广义表的元素也可以为空。

                 .........................持续更新中

发布了31 篇原创文章 · 获赞 1 · 访问量 1274

猜你喜欢

转载自blog.csdn.net/qq_45824565/article/details/104433089