博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客网试题+答案分析+大牛面试经验(2)
阅读量:3531 次
发布时间:2019-05-20

本文共 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/

你可能感兴趣的文章