1.有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?(B)
A. A按行存,B按行存。
B. A按行存,B按列存。
C. A按列存,B按行存。
D. A按列存,B按列存。
解析:传统的分块矩阵相乘:是行乘以列的方式。Strassen矩阵相乘:涉及到行的加法(a+b,c+d,e+f,g+h),列的减法(f-h,g-e,b-d,a-c),对角线的加法(a+d,e+h)以及行列的乘法,所以无论是A按行存,B按行存。A按行存,B按列存。计算速度都是差不多的。而如果用的是传统矩阵相乘法,按B选项的方式存储计算速度更快。
2.下面描述中正确的为:(c)
A.线性表的逻辑顺序与物理顺序总是一致的。
B.线性表的顺序存储表示优于链式存储表示。
C.线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
D.二维数组是其数组元素为线性表的线性表。
解析:A,线性表逻辑上是线性的,存储上可以是顺序的,可以是链式的。B,顺序存储和链式存储各有优缺点。C,链式存储可以连续,可以不连续,存储时不管其连续还是不连续,都是用指针指向下一个结点。D,二维数组是顺序存储的线性表,其元素都是线性表的元素。
3.假设 8 行 10 列的二维数组a[1…8 , 1…10] 分别以行序为主序和以列序为主序顺序存储时,其首地址相同,那么以行序为主序时元素 a[3 , 5] 的地址与以列序为主序时() 元素相同。注意:第一个元素为a[1][1] (D)
A.a[7,3]
B.a[8,3]
C.a[3,4]
D.ABC都不对
解析:设数组首地址为SA:以行序为主序时,a[3][5]首地址(相当于a[3][4]的末地址)为 SA + (3-1)×10 + (5 - 1) = SA + 24.以列序为主序时,设所求列号为m,行号为n,即a[m][n];SA + (m-1)×8 + (n - 1) = SA + 24;化简:8m + n = 33;穷举法求得唯一解:m = 4,n = 1;即a[4][1],则ABC都不对,选D。
4.数组 A[0…5 , 0…6] 的每个元素占 5 个字节,将其按列优先次序存储在起始地址为 1000 的内存单元中,则元素 A[5 , 5] 的地址为(A)
A.1175
B.1180
C.1205
D.1210
解析:数组 A[0…5 , 0…6] 等价于A[7][6]. 元素A[m][n] 的地址= (m*6+n)*5+1000. A[5][5]的地址=1175.
5.将数组 var a=[1,2,3] 变成数组 [4,3,2,1] 下面的方式正确的是?(A、C)
A.a.reverse().unshift(4)
B.a.push(4).reverse()
C.a.push(4); a.reverse()
D.a.splice(3,1,4).reverse()
解析:reverse()反转数组 「return 返回数组」unshift()在数组开头添加元素 「返回数组长度」push()在数字结尾添加元素 「返回数组长度」splice(index,howmany,item1,.....,itemX)从下标index开始删除howmany个元素,再把item1,.....,itemX添加到数组中 「返回被删除的元素」
6.需要频繁的插入删除操作使用什么结构比较合适?(C)
A.数组
B.队列
C.链表
D.栈
解析:A 数组是由下标和值组成的一对一对的集合数据,是连续的存储单元存储,顺序存储。B D队列和栈分别是先进先出,和先进后出规则,不方便频繁进行插入和删除。
7.矩阵中的行列数可以是不相等的,这样的说法正确吗?(A)
A.正确
B.不正确
解析:本来就是
8.具有 n 个整数的数组 A=[29,6,28,20,2,24] 使用插入排序( Insertion Sort )算法排序,算法伪代码如下:经过三趟排序后,数组 A 的排列状态将是(C)
A.6,29,28,20,2,24
B.6,28,20,2,24,29
C.6,20,28,29,2,24
D.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。
9.下列数据结构具有记忆功能的是?(C)
A.队列
B.循环队列
C.栈
D.顺序表
解析:栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。栈按照“先进后出”(FILO)或“后进先出”(LIFO)组织数据,栈具有记忆作用。
10.以下多维数组声明语句中,不正确的有( B)。
A.int[,]a = new int[2,3];
B.int[,] a = {{1,2,3}};
C.int[2,3] a = new int[2,3];
D.int[,] a = {{1,2,3},{2,3}}
解析:二维数组,你要么左侧中括号中显示行数列数,要么右侧大括号中显示出。选项b 列数不明确
11.在表长为n的顺序表上做插入运算,平均要移动的结点数为(C ) 。
A.n/4
B.n/3
C.n/2
D.n
解析:假设长度为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。
12.设 int x[]={1,2,3,4,5,6},*p=x; 则值为 3 的表达式是(B)
A.p+=2,*++p;
B.p+=2,*p++
C.p+=3,*p
D.p+=2,++*p
解析:b选项 *的优先级高于++. 所以执行的步骤是 1.p+=2 指针p右位移2,指向了数据3 2.执行*p 将指针p指向的数据输出(结果) 3.++ 处理完事后 将数据3加1,不算作结果。
13.int (*p)[3] p的含义是什么?(B)
A.一个指向int元素大小为3的指针数组
B.一个指向元素个数为3的int数组的指针
C.不合法
D。以上说法都不正确
解析:1、int(*p)[4];------ptr为指向含4个元素的一维整形数组的指针变量(是指针) 2、int *p[4];-------定义指针数组p,它由4个指向整型数据的指针元素组成(是数组) 3、int(*)[4];--------实际上可以看作是一种数据类型。也就是第一个(int(*p)[4];)
14.以下不合法的数组定义是(C)
A.char a[] = "good"
B.int s[5] = {1, 2, 3, 4};
C.char s = "good";
D.char s[] = {0, 1, 2, 3, 4};
解析:数组 char[]。
15.一个5*4的矩阵,有多少个长方形?(正方形也算是长方形)(B)
A.120
B.150
C.100
D.80
解析:可以这样理解:五行四列的表格有6*5条边,从六条边选两条(横向),从四条边中选两条(纵向),就可以确定一个矩形。C(6,2)*C(5,2)=15*10=150。
16.对于长度为n的线性表,建立其对应的单链表的时间复杂度为(C)。
A.O(1)
B.O(log2n)
C.O(n)
D.O(n^2)
解析:无论采用什么方式建立单链表,都需要扫描这n个元素,边扫描边创建单链表中的结点并链接起来,其时间复杂度为O(n)。
17.对于不同的特殊矩阵应该采用不同的存储方式,这样的说法正确吗?(A)
A.正确
B.不正确
解析:特殊矩阵中元素有规律,采用数组存储。而像稀疏矩阵中元素没有规律,所以一般采用三元组或者伪地址表示法~
18.对于一维整形数组 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]
解析:定义一个数组使用[]确定其大小,[]中的值须为定制,define宏定义的值也为定值,可以用来定义数组。若需要定义不确定长度的则使用new进行分配,int *a=new int[size];
19.最坏情况下,合并两个大小为n的已排序数组所需要的比较次数(B)
A.2n
B.2n-1
C.2n+1
D.2n-2
解析:最坏情况为: 每比较一次,只确定一个元素的位置(最后一次比较确定两个元素的位置,即倒数第一个和倒数第2个),所以总的最坏比较次数为2n-1。
20.下列给定程序中,函数fun的功能是:进行数字字符转换。若形参ch中是数字字符'0'~'9',则将'0'转换成'9','1'转换成'8', '2'转换成'7',…, '9'转换成'0';如果是其他字符则保持不变,并将转换后的结果作为函数值返回。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
试题程序。(A、B)
A.int ch<='9' '0'
B.char ch<='9' '0'
C.char ch<='9' 0
D.int ch<='9' 0
解析:A、返回char,那么if条件里面做了隐式类型转换:int数字转成char。B、返回int,那么main中赋值给char变量的时候做了类型转换,int转char。
21.若有定义:byte[]x={11,22,33,﹣66};其中0≤k≤3,则对x数组元素错误的引用是(C)
A.x[5-3]
B.x[k]
C.x[k+5]
D.x[0]
解析:下标越界问题:数组中有4个元素,小标范围为0~3。A: x[5-3],小标为2 √;B: x[k], k的范围0~3 √;C: x[k+5], 小标范围为5~8 越界×;D: x[0], 小标为0 √。
22.一维数组与线性表的区别是( A )。
A.前者长度固定,后者长度可变
B.后者长度固定,前者长度可变
C.两者长度均固定
D.两者长度均可变
解析:数组的长度是固定不变的,数组是线性表的一种。而线性表有多种形式,其长度可变。
23.下面哪项不是链表优于数组的特点?(D)
A.方便删除
B.方便插入
C.长度可变
D.存储空间小
解析:1、链表方便删除和插入,只需知道结点和要插入的信息即可;2、长度可变,一般链表是动态分配内存空间;3、链表的结点信息至少包含数据域和指针域,相同数据下:数组的大小是链表大小的子集。
24.从逻辑结构上看,n维向量的每个元素均属于1个n维向量(A)
A.对
B.错
解析:通俗的说,在Z中增加一维,也就是在每个元素增加一类属性,也就是增加一个向量,此时Z中每个元素已经对应三种属性(向量).
同理,n维数组的每个元素均属于n个向量。
25.char str[]=”Hello”,sizeof(str)=(C)
A.4
B.5
C.6
D.7
解析:实际存储为{'H','e','l','l','o','\0'},所以是6个。
26.若有说明:int a[10];,则对数组元素的正确引用是( D )。
A.a[10]
B.a[3,5]
C.a[5]
D.a[10-10]
解析:A的范围太大,无法确定是某一个数组元素,越界了;B中逗号表达式为最后一个,但是数组里面不适用;C不是数组的引用方式;D中a[10-10]相当于a[0],可以。
27.设有一个n阶的下三角矩阵A,如果按照行的顺序将下三角矩阵中的元素(包括对角线 上元素)存放在n(n+1)个连续的存储单元中,则A[i][j]与 A[0][0]之间有[$##$]个数据元素(即不算A[i][j]和A[0][0])。(A)
A.j<=i ? i*(i+1)/2 +j-1: i*(i+1)/2+i
B.j>=i ? i*(i+1)/2 +j-1: i*(i+1)/2+i
C.j>=i ? i*(i+1)/2 +j: i*(i+1)/2+1
D.j<=i ? i*(i+1)/2 +j+1: i*(i+1)/2+1
解析:数组A[n][n]从A[0][0],开始。所以A[ i ][ j ]中,当 i>=j 时, A[ i ][ j ]位于下三角矩阵中。 第0行,1个元素(此A[0][0]元素不计入,所以要去掉)== > (1-1); 第(i-1)行,i个元素; 第 i 行,(j+1)个元素(从 0~j 一共有(j+1)个元素,由于A[i][j]不计入在内,所以要去掉一个)==> ((j+1)-1);结果为:(1-1)+2+3+...+i+((j+1)-1) = i*(i+1)/2+j -1。当 i < j时;A[ i ][ j ]位于上三角矩阵中。故计算到A[ i ][ i ]即可,且包括A[ i ][ i ].; 第0行,1个元素(此A[0][0]元素不计入,所以要去掉)== > (1-1); 第(i-1)行,i个元素;第 i 行,(i+1)个元素(从 0~i 一共有(i+1)个元素);结果为:(1-1)+2+3+...+i+(i+1) = i*(i+1)/2+i。
28.一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,这个序列的初始值从1开始,但是1并不在这个数列中。求第1500个值是多少?(C)
A.2040
B.2042
C.2045
D.2050
解析:2、3、5的最小公倍数是30。[ 1, 30]内符合条件的数有22个。如果能看出[ 31, 60]内也有22个符合条件的数,那问题就容易解决了。也就是说,这些数具有周期性,且周期为30.第1500个数是:1500/22=68 1500%68=4。也就是说:第1500个数相当于经过了68个周期,然后再取下一个周期内的第4个数。一个周期内的前4个数:2,3,4,5。故,结果为68*30=2040+5=2045。
29.设二维数组A[0..m-1][0..n-1]按行优先顺序存储,则元素A[i][j]的地址为(B)
A.LOC(A[0][0])+(i*m+j)
B.LOC(A[0][0])+(i*n+j)
C.LOC(A[0][0])+[(i-1)*n+j-1]
D.LOC(A[0][0])+[(i-1)*m+j-1]
解析:首先,注意数组是从0开始还是从1开始;其次,数组的大小,数组的列数表示每行有几个元素,数组的行数表示每列有多少个元素。
30.以下二维数组声明中,正确的是(B)。
A.char b[2][3]={"a","b","c"};
B.char b[][3]={0};
C.char b[2][]={0};
D.char b[][]={0}
解析:A.char str[2][3]表示声明了一个字符串的数组,最多可以存放两个字符串,每一个字符串的长度为3。题中{"a","b","c"}为三个字符串。C.在声明数组时,数组个数可以缺省,数组长度不能缺省。该项中数组长度缺省。D.同上。