-
设有一个长度为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 -
请问对一个排好序的数组进行查找,用平均时间复杂度最小的算法,时间复杂度为(B)
A.O(n)
B.O(lgn)
C.O(nlgn)
D.O(1)
解析:
已知数组顺序,二分查找法复杂度最低。
-
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 -
设有一个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
解析:
-
设一组初始关键字记录关键字为(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; -
数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。(D)
A.a
B.a [ 0 ]
C.a
D. a++
解析:
a代表数组名或者内存连续区域第一块数据的地址。接[]表示基址寻址。加表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。 -
设有数组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 -
若以1234作为双端队列的输入序列,则既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列是©
A.1234
B.4132
C.4231
D.4213
解析:
双端队列是一种同时具有队列和栈的性质的一种数据结构,在队列的两头都可以进行插入和删除的操作;输入受限的双端队列是指只能从队列一端输入,可以从两端输出的双端队列;同理,输出受限的双端队列是指只能从队列一端输出,可以从两端输入的双端队列;如果双端队列允许从一端输入,从一端输出,则是普通的队列,如果双端队列只允许从一端输入和输出则是栈。因此说双端队列同时具有队列和栈两种数据结构的性质。
-
ArrayLists和LinkedList的区别,下述说法正确的有?(ABCD)
A.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
B.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
C.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
D. ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
解析:
-
已知操作符包括‘+’、‘-’、‘’、‘/’、‘(’和‘)’。将中缀表达式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;
}
};