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

2022.10.27-Java数组专项练习

1、设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1…n(n+1)/2]中,对上述任一元素aij(1<=i,j<=n,且i<=j)在B中的位置为( B )。

A. i ( i-1 )/ 2 + j
B. j ( j-1 )/ 2 + i
C. j ( j-1 )/2 + i + 1
D. i ( i-1 )/2 + j + 1

解析:
审题:存对角线及对角线上方的元素
1、以列为主,2、存储位置从1开始,3、默认主对角线,即左上角到右下角
例子:求a25的位置(i = 2, j = 5)
  1、前4列元素个数相加1+2+3+4 = 4*(4+1)/2 (即(j - 1)*j / 2)
  2、再加上第5列中的元素个数2(在第i行,故有i个)
  3、因此有(j - 1)*j / 2 + i
((1 + j - 1)/2) * (j - 1 ) + i = (j * (j - 1))/2 + i

2、数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为( C )。

A. SA + 141
B. SA + 144
C. SA + 222
D. SA + 225

解析:
元素A[8][5]前面存放了710 + 4 = 74个元素,该元素起始地址即上一地址的结束,地址为SA + 743 = SA + 222

3、(多选)以下几种方式当中,稀疏矩阵压缩的存储方法是( A,D )。

A. 三元组
B. 二维数组
C. 散列
D. 十字链表

解析:
三元组表示稀疏矩阵可大大节省空间,但是当涉及到矩阵运算时,要大量移动元素。
十字链表表示法可以避免大量移动元素。

4、多维数组可以看作数据元素也是基本线性表的基本线性表,这样的说法正确吗?( A

A. 正确
B. 不正确

解析:
n维数组中每个元素都可以看作n-1维的线性表,一直递推到1维即为一维线性表。

5、设有一个二维数组A[m][n],假设A[0][0]存放位置在644,A[2][2]存放位置在676,每个元素占一个空间,问A[3][3]存放的位置在( C )。

A. 688
B. 678
C. 692
D. 696

解析:
A[0][0]存放位置在644,A[2][0]存放位置在674,可知一行有15列,A[3][3]存放的位置为644 + 3*15 + 3 = 692。

6、以下哪个选项正确定义了一维数组( A )。

A. char a[0] = {‘0’, ‘1’, ‘2’, ‘3’, ‘\0’};
B. char a = {‘A’, ‘B’, ‘C’};
C. int a[] = “0123”;
D. int a[3] = {0, 1, 2, 3};

解析:
B选项中,a并没有定义为数组,而是字符,会出错;改正:后面加上[]
C选项整型数组不能被赋值字符串;改正:int改成char
D选项定义的初值个数超过了数组的长度。a[3]改成a[4]

7、JDK8之前版本,HashMap的数据结构是怎样的?( C

A. 数组
B. 链表
C. 数组+链表/红黑树
D. 二叉树

8、对于一维整型数组a,以下描述正确的是( D

A. int a(10);
B. int n = 10,a[n];
C. int n; scanf(“%d”,&n); int a[n];
D. #define SIZE 10 int a[SIZE]

解析:
不管什么语言,数组定义中等号左边括号内如果有则必须为常数,如果是变量n,那后面对n进行修改导致冲突,变量可改变但数组长度不能改。D的define是设置常量,之后不能更改。

9、数组A的每个元素需要4个字节存放,数组有8行10列,若数组以行为主顺序存放在内存SA开始的存储区内,则A中8行5列的元素的位置是( C

A. SA + 74
B. SA + 292
C. SA + 296
D. SA + 300

解析:
SA + (7 * 10 + 4) * 4 = SA + 296

10、关于Array数组对象的说法不正确的是( B

A. push()向数组的末尾添加一个或更多元素,并返回新的长度
B. pop()删除并返回数组的第一个元素
C. unshift()向数组的开头添加一个或更多元素,并返回新的长度
D. join()把数组的所有元素放入一个字符串

解析:
1、pop()删除数组的最后一个元素,把数组的长度减一,并且返回它被删除元素的值,如果数组变为空,则该方法不改变数组,返回undefine的值
2、shift()方法和unshift()方法恰恰相反,该方法用于把数组的第一个元素从其中删除,并返回被删除的值,如果数组是空的,shift()方法将不进行任何操作,返回undefine的值

11、若有以下程序段:

int a[] = {4, 0, 2, 3, 1}, i, j, t;
for(int i = 1;i < 5;i++){
	t = a[i];
	j = i - 1;
	while(j >= 0 && t > a[j]){//a[i] > a[i - 1]
		//后面元素大于前面元素,交换,则为降序
		a[j + 1] = a[j];//a[i] = a[i - 1]
		--j;
	}
	a[j + 1] = t;
}

则该程序段的功能是( B

A. 对数组a进行插入排序(升序)
B. 对数组a进行插入排序(降序)
C. 对数组a进行选择排序(升序)
D. 对数组a进行选择排序(降序)

解析:
插入排序的原理:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去。
选择排序的原理:每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值。
在第i次排序中,前i-1个元素始终是有序的,此时只需把第i个元素插入到有序的序列中即可,故代码中体现的是插入排序的思想。代码中对当前 a[i] > a[j](0<= k

插入排序:
for(int i = 1;i < v.size();i++){
  int key = v[i];
  int j = i - 1;
  while(j >= 0 && v[j] > key){
    v[j + 1] = v[j];
    j–;
  }
  v[j + 1] = key;
}
选择排序:
for(int i = 0;i < v.size();i++){
  int min = v[i];
  int temp;
  index = i;
  for(int j = i + 1;j < v.size();j++){
    if(v[j] < min){
      min = v[j];
      index = j;
    }
  }
  temp = v[i];
  v[i] = min;
  v[index] = temp;
}

你可能感兴趣的:(牛客Java专项练习,java,数据结构,算法)