本文共 3152 字,大约阅读时间需要 10 分钟。
(1)若有说明:int a[3][4];,则对 a 数组元素的非法引用是( )
A、a[0][2*1] B、a[1][3] C、a[4-2][0] D、a[0][2+2] 答案:D 解析:a[0][4]相当于第一行第5个元素,而a是三行四列的数组,下标最大的元素为a[2][3],即第三行第4个元素; D 下标从0开始,从0开始,从0开始 重要的事说三遍; 错误的原因在于溢出了。
(2)数组通常具有的两种基本操作是()
A、查找和修改 B、查找和索引 C、索引和修改 D、建立和删除 答案:A 解析:一定要注意,索引表示的是数组的下标,而不是一种操作。
(3)设有一个 10 阶的对称矩阵 A ,采用压缩存储方式,以行序为主存储, a1 , 1 为第一个元素,其存储地址为 1 ,每个元素占 1 个地址空间,则 a8 , 5 的地址为 。
A、13 B、33 C、18 D、40 答案:B 解析:对称矩阵,只需要存一半就行了, 第一行:1个 第二行:2个 第三行:3个 ...以此类推到第七行; 第八行:1~5,前5个 所以:1+2+3+4+5+6+7 再加 5 总共得:33; 需要注意的地方是:需要注意的是,对阵矩阵,以下三角方式存。
(4)稀疏矩阵一般的压缩存储方式有两种,即 。
A、二维数组和三维数组 B、三元组和散列 C、三元组和十字链表 D、散列和十字链表 答案:C 解析:所谓三元组就是一个元素存放三个信息,矩阵中的行号,列号以及值,这样就可以不存放值为0的元素,实现压缩。 十字链表相当于是邻接表和逆邻接表的合集,在一个元素里面存放了值以及出度表和入度表, 这样也不需要像邻接矩阵那样存放大量0元素,而且找一个节点的入节点和找出节点一样快。
(5)A为整数数组, N为A的数组长度,请问执行以下代码,最坏情况下的时间复杂度为____。
void fun(int A[], int n) { for (int i = n - 1; i >= 1; i--) { for (int j = 0; j < i; j++) { if (A[j] > A[j+1]) { int tmp = A[j + 1]; A[j + 1] = A[j]; A[j] = tmp; } } } } A、O(N) B、O(N^2) C、O(Nlog(N)) D、O(log(N)) E、O(N^3) F、无法确定 答案:B 解析:冒泡排序法,最坏情况为(n-1)+(n-2)+……+1=n(n-1)/2 所以复杂度是N^2。 知识点:何谓冒泡排序法 (1)两两比较相邻元素A(I)和A(I+1)(I=1,2,…N-1),如果A(I)>A(I+1),则交换A(I)和A(I+1)的位置; (2)对剩下的N-1个元素,再两两进行比较,按同样规则交换它们的位置,经过N-2次比较,将次最大值交换到A(N-1)的位置; (3)如法炮制,经过N-1趟的“冒泡处理”,每趟进行N-i次的比较,全部数列有序。
(6)数组 A[0 … 4 , -1 … -3 , 5 … 7] 中含有的元素个数是 。
A、55 B、45 C、36 D、16 答案:B 解析:这是一个三维数组,三维为X,Y,Z,算出每个维度的容量,相乘即为答案。
(7)有一个用数组C[1…m]表示的环形队列,m为数组的长度。假设f为队头元素在数组中的位置,r为队尾元素的后一位置(按顺时针方向)。若队列非空,则计算队列中元素个数的公式应为?
A、(m+r-f)mod m B、r-f C、(m-r+f) mod m D、(m-r-f) mod m E、(r-f) mod m F、需要判断边界 答案:A 解析: 注意数组C[1..m]下标从1开始,并且r为队尾元素的后一位置。 当r>f时,好说,队列的长度为r-f; 当r
(8)c中,二维数组初始化的方法是:int a[3][3]={
{1},{2},{3}};说法是否正确?A、正确 B、错误 答案: A 解析:最外层的 { ... } 会初始化 a[] 即第一维。而 {1} 会初始化 a[0][] 由于只有一个元素,后续元素会默认置 0 。其他同理。
(9)若已定义: int a[]=[0,1,2,3,4,5,6,7,8,9],*p=a,i; 其中0≤i≤9,则对a数组错误的引用是()
A、a[p-a] B、*(&a[i]) C、p[i] D、a[10] 答案:D 解析:数组下标范围为0~9,所以a[10]越界。 知识点:(1)A正确,因为指针是有减法的,不过只在数组之中应用,用来表示元素的个数的差. 这里 p 和 a其实是相等的,所以A答案等价与 a[0]. (2)数组名就是数组的首地址,此时p和a相等,即[p-a]就是 a[0]. *(&a[i])就是a[i] p[i]相当于a[i] p+i是指向数组a[i]的指针。
(10)关于 int a[10]; 问下面哪些不可以表示 a[1] 的地址?
A、a+sizeof(int) B、&a[0]+1 C、(int*)&a+1 D、(int*)((char*)&a+sizeof(int)) 答案:A 解析: A. a+sizeof(int) // 不正确, 在32位机器上相当于指针运算 a + 4 B. &a[0]+1 // 正确,数组首元素地址加1,根据指针运算就是a[1]的地址 C. (int*)&a+1 // 正确,数组地址被强制类型转换为int*,然后加1,这样和B表示的一个意思 D. (int*)((char*)&a+sizeof(int)) // 正确,数据地址先被转换为char*,然后加4,根据指针运算公式,向前移动4 * sizeof(char),之后被转换为int*,显然是a[1]的地址
转载地址:http://fwyhj.baihongyu.com/