Java数组专项练习(三)

1、数组元素的下标值越大,存取时间越长,这样的说法正确吗?

正确答案: B   你的答案: B (正确)

正确

不正确

分析:

数组存取采用首地址加上元素所在位置*元素大小计算(行优先或者列优先)其所在地址 假设一个数组为a[10][10] 数组a[0][0]地址为0x00,采用行优先存储,元素占4个字节 a[i][j]的地址为0x00+(i*10+j)*4 所以不会因为数组过长而导致存取时间变长 


2、数组作为函数参数传递的是() 。

正确答案: A   你的答案: A (正确)

数组的首地址
数组元素个数
数组中各元素值
数组的大小

分析:

A。考察的是数组传递给函数作为参数的原理

传递方式如下种:每种方式都会告诉编译器要接收一个指针,及数组的地址(首元素地址)

void myFunction(int *param)
{
    //形式参数是一个指针
}
 
void myFunction(int param[10])
{
    //形式参数是一个已定义大小的数组
}
 
void myFunction(int param[])
{
    //形式参数是一个未定义大小的数组
}

3、给定如下代码: int x[4]={0}; int y[4]={1}; 数组x和y的值为()

正确答案: B   你的答案: B (正确)

{0,0,0,0},{1,1,1,1}
{0,0,0,0},{1,0,0,0}
{0,不确定},{1,不确定}
与编译器相关

 分析:

如果初始化时指定的的元素个数比数组大小少, 剩下的元素都回被初始化为0。


4、设 int x[]={1,2,3,4,5,6},*p=x; 则值为 3 的表达式是

正确答案: B

p+=2,*++p;
p+=2,*p++
p+=3,*p
p+=2,++*p

分析:

*p=x这里指针p指向数组的首元素地址,p+=2则指针指向第三个元素,而*++p是前置加加,p先自增,再解引用,就指向第四个元素了 b中为后置加加,是先解引用再加所以不影响,正确, c中p+=3就错了,因为指向第四个元素了 d中++*p,因为*p为3,所以就是++3了,结果为4 


5、具有 n 个整数的数组 A=[29,6,28,20,2,24] 使用插入排序( Insertion Sort )算法排序,算法伪代码如下:

经过三趟排序后,数组 A 的排列状态将是()

正确答案: C

6,29,28,20,2,24
6,28,20,2,24,29
6,20,28,29,2,24
2,6,20,24,28,29

分析:

实现机理是这样的:

有一组数据A=[29,6,28,20,2,24]

①第一次先排前俩,第二次排前三。。。。以此类推

②先获取A[j]的值存入一个变量中

③每次循环判断大小的目的就是为了找到A[j-1]小于e的情况

④当出现前大于e的情况,那就把大的值后移,也就是赋值给A[j]

⑤当出现前不大于e的时候(A[j-i]<e),break跳出,此时j不减减,此时j的位置就是需要e来填充的

第一趟的结果为6 29 28 20 2 24

第二趟为6 28 29 20 2 24

第三趟:  j为3,e为A[3] = 20,那么先比较的就是A[3-1]和e,其结果为A[3]被赋值为A[3-1],

而后j-- 进入A[2-1]和e的判断,同样是A[2]被赋值为A[1],

然后再判断A[0]和e,发现A[0]小于e,break退出,此时j=1,A[1]=e;end;


6、稀疏矩阵一般的压缩存储方式有两种,即

正确答案: C

二维数组和三维数组
三元组和散列
三元组和十字链表
散列和十字链表

 分析:

所谓三元组就是一个元素存放三个信息,矩阵中的行号,列号以及值,这样就可以不存放值为0的元素,实现压缩。 十字链表相当于是邻接表和逆邻接表的合集,在一个元素里面存放了值以及出度表和入度表,这样也不需要像邻接矩阵那样存放大量0元素,而且找一个节点的入节点和找出节点一样快。


7、数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的

正确答案: D   你的答案: D (正确)

*a
a [ 0 ]
a
a++

分析:

a代表数组名或者内存连续区域第一块数据的地址。接[]表示基址寻址。加*表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。数组中a指的是数组首地址 地址是常量,不可以自加。


8、采用压缩存储之后,下三角矩阵的存储空间可以节约一半,这样的说法正确吗?

正确答案: B

正确

不正确

分析:

下(上)三角矩阵是主对角线以上(下)元素均为零的n阶矩阵。设以一维数组sb[0..n(n+1)/2]作为n阶三角矩阵B的存储结构,仍采用按行存储方案,则B中任一元素bi,j和sb[k]之间仍然有如上的对应关系,只是还需要再加一个存储常数c的存储空间即可。在下三角矩阵中,用n(n+1)/2的位置来存储常数。 


9、二维数组和多维数组均不是线性结构。( )

正确答案: A

正确

错误

分析:

线性结构是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。

常用的线性结构有:线性表,栈,队列,双队列,数组,串。

非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。

常见的非线性结构有:二维数组,***数组,广义表,树(二叉树等),图。(其中***数组是由多个一维数组组成的,所以不再是线性结构)


10、已知数组D的定义是int D[4][8];,现在需要把这个数组作为实参传递给一个函数进行处理。下列说明汇总可以作为对应的形参变量说明的是()

 正确答案: C D   你的答案: D (错误)

int D[4][]
int *s[8]
int(*s)[8]
int D[][8]

分析:

二维数组在内存中也是连续存储的,他可以通过 arr[i][j]寻址是因为我们定义了这个数组有多少列,加入有N列,这样数组寻址的时候编译器会自动得到 *(arr+(j*N)+i)所以传参数的时候列数必须指定。所以D正确A不正确。B表示有8个指向int指针的数组,不对,而C中(*s)等价于s[]。因此答案CD;


版权声明:本文为weixin_44077638原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。