Day2刷题总结

  1. 设有一个长度为n的顺序表,要在第i(从1开始)个元素之前(也就是插入元素作为新表的第i个元素),则移动元素个数为( A )。
    A.n-i+1
    B.n-i
    C.n-i-1
    D.i
    解析:
    1 2 3 4 5
    n = 5
    要在第i=2个元素之前插入
    则n-i=3
    而实际插入位置为:
    1 [ ] 2 3 4 5
    所以是n-i+1

  2. 请问对一个排好序的数组进行查找,用平均时间复杂度最小的算法,时间复杂度为(B)
    A.O(n)
    B.O(lgn)
    C.O(nlgn)
    D.O(1)
    解析:
    已知数组顺序,二分查找法复杂度最低。
    在这里插入图片描述
    在这里插入图片描述

  3. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是(B)
    备注:数组下表从0开始。
    A.i(i+1)/2+j
    B.j(j+1)/2+i
    C.i(j+i)/2+1
    D.j(i+1)/2+1
    解析:
    由于是对称矩阵,因此 aij=aji
    存储的时候就只需要存储一半就可以,存 n(n+1)/2 个数
    当i>j s[i(i+1)/2+j] = aij

  4. 设有一个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
    解析:
    在这里插入图片描述

  5. 设一组初始关键字记录关键字为(20,15,14,18,21,36,40,10),则以20为基准记录的一趟快速排序结束后的结果为( A )。
    A.10,15,14,18,20,36,40,21
    B.10,15,14,18,20,40,36,21
    C.10,15,14,20,18,40,36,2l
    D.15,10,14,18,20,36,40,21
    解析:
    一趟快速排序的算法是:
    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
    5)重复第3、4步,直到i=j;

  6. 数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。(D)
    A.a
    B.a [ 0 ]
    C.a
    D. a++
    解析:
    a代表数组名或者内存连续区域第一块数据的地址。接[]表示基址寻址。加
    表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。

  7. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以行为内存放时,元素A[5,8]的存储首地址为()
    A.BA+141
    B.BA+180
    C.BA+222
    D.BA+222
    解析:(4*10+7)*3=141

  8. 若以1234作为双端队列的输入序列,则既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列是©
    A.1234
    B.4132
    C.4231
    D.4213
    解析:
    双端队列是一种同时具有队列和栈的性质的一种数据结构,在队列的两头都可以进行插入和删除的操作;输入受限的双端队列是指只能从队列一端输入,可以从两端输出的双端队列;同理,输出受限的双端队列是指只能从队列一端输出,可以从两端输入的双端队列;如果双端队列允许从一端输入,从一端输出,则是普通的队列,如果双端队列只允许从一端输入和输出则是栈。因此说双端队列同时具有队列和栈两种数据结构的性质。
    在这里插入图片描述

  9. ArrayLists和LinkedList的区别,下述说法正确的有?(ABCD)
    A.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
    B.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
    C.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
    D. ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
    解析:
    在这里插入图片描述

  10. 已知操作符包括‘+’、‘-’、‘’、‘/’、‘(’和‘)’。将中缀表达式a+b-a((c+d)/e-f)+g转换为等价的后缀表达式ab+acd+e/f-*-g+时,用栈来存放暂时还不能确定运算次序的操作符,若栈初始时为空,则转换过程中同时保存在栈中的操作符的最大个数是()。
    A.5
    B.7
    C.8
    D.11
    解析:
    表达式求值是栈的典型应用。中缀表达式不仅依赖于运算符的优先级,还要处理括号。后缀表达式的运算符在表达式的后面且没有括号,其形式已经包含了运算符的优先级。所以从中缀表达式转换到后缀表达式需要用运算符进行处理,使其包含运算符优先级的信息,从而转换为后缀表达式的形式。

编程题

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

class Solution{
		public:
		vector<int> printMatrix(vector<vector<int> > matrix) { 
		vector<int>res; 
		res.clear(); 
		int row=matrix.size();//行数 
		int collor=matrix[0].size();//列数 
		//计算打印的圈数 
		int circle=((row<collor?row:collor)-1)/2+1;//圈数
		for(int i=0;i<circle;i++){ 
			//从左向右打印 
			for(int j=i;j<collor-i;j++) 
				res.push_back(matrix[i][j]); 
			//从上往下的每一列数据 
			for(int k=i+1;k<row-i;k++) 
				res.push_back(matrix[k][collor-1-i]); 
			//判断是否会重复打印(从右向左的每行数据) 
			for(int m=collor-i-2;(m>=i)&&(row-i-1!=i);m--) 
				res.push_back(matrix[row-i-1][m]); 
			//判断是否会重复打印(从下往上的每一列数据) 
			for(int n=row-i-2;(n>i)&&(collor-i-1!=i);n--) 
				res.push_back(matrix[n][i]);
			} 
		return res;
		}
};

猜你喜欢

转载自blog.csdn.net/sl1130398099/article/details/82964844