开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
自信人生二百年,会当水击三千里!
一、选择题
1、下面的排序方法中,关健字比较次数与初始排列无关的是()
A、直接选择排序
B、希尔排序
C、直接插入排序
D、冒泡排序
答案:A。分析:
元素的移动次数与关键字的初始排序无关的是:归并排序、基数排序
元素的比较次数与初始序列无关的是:选择排序、基数排序
算法的时间复杂度与初始序列无关的是:堆排序、归并排序、选择排序、基数排序
2、在有序双向链表中定位删除一个元素的平均时间复杂度为()
A.0(1)
B.O(N)
C.0(logN)
D.0(N*logN)
答案:B。分析:链表只能顺序查找,O(N)的单次查找,O(1)的删除时间复杂度。所以综合就是O(N)。
3、在一个以 h 为头指针的单循环链表中,p指针指向链尾结点的条件是()
p->data==-1
p->next==NULL
p->next->next==h
p->next==h
答案:D。分析: p->next==head时,就代表 p指针指向链尾结点的条件是。
4、已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key)=key%7计算散列地址,并散列存储在散列表A【0...6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为
A.1.5
B.1.7
C.2.0
D.2.3
已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key)=key%7计算散列地址,并散列存储在散列表A【0...6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为
A.1.5
B.1.7
C.2.0
D.2.3
5、若用数组SI...n]作为两个找S1和S2的存储结构,对任何一个栈只有当S全满时才不能做入找操作。为这两个栈分配空间的最佳方案是
A. S1的栈底位置为0,s2的栈底位置为n
B.S1的栈底位置为0,s2的找底位置为n/2
C.S1的栈底位置为1,S2的栈底位置为n/2
答案:A。分析:两个栈的栈底一个在数组第一个元素,朝着数组正方向增长另一个在数组最后一个元素,朝着数组索引减小的方向增长。当两个栈的栈顶相等是,表明数组满了,不能继续入栈。
6、有1000个无序的整数,希望使用最快的方式找出前50个最大的,最佳的选择是()
A、快速排序
B、冒泡排序
C、堆排序
D、基数排序
答案:C。分析:快排的时间复杂度是O(nlogn),最坏的情况下是O(n^2),堆排序的最差、最佳和平均都是O(nlogn),这题如果只考虑最佳的情况下是没有意义的,要从最差时间复杂度来考虑。
7、循环队列的存储空间为Q(12000,初始状态为front=rear=200。经过一系列正常的入队与退队操作后,front=rear=1,则循环队列中的元素个数为()。
A.0或200
B.1
C.2
D.199
答案:A。分析:循环队列只有空或者满的时候,才会出现入队位置和出队位置相同。
8、将一棵二叉树的根节点放入队列,然后非递归的执行如下操作:将出队节点的所有子节点入队。以上操作可以实现哪种遍历
A.前序遍历
B.中序遍历
C.后续遍历
D.层序编历
答案:D。分析:前序中序后序的非递归都是用栈实现的,层次遍历是用队列实现的。
9、下列关于线性链表的叙述中,正确的是()
A、各数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致
B、各数据结点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续
C、进行插入与删除时,不需要移动表中的元素
D、以上说法均不正确
答案:C。分析:链表在执行插入和删除操作时只需要改变指针指向, 不需要移动表中的元素。
10、下列描述的不是链表的优点是()
A、逻辑上相邻的结点物理上不必邻接
B、插进、删除运算操纵方便,不必移动结点
C、所需存储空间比线性表节省
D、无需事先估计存储空间的人小
答案:C。链表 所需存储空间比线性表多,其他选项都是链表的优点。
二、编程题
1、小易的升级之路
代码分析:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int s[N] = {0};
int main()
{
int n, a;
while (cin >> n >> a)
{
int sum = a;
for (int i = 0; i < n; i++)
{
cin >> s[i];
}
for (int i = 0; i < n; i++)
{
if (a >= s[i])
{
a += s[i];
}
else
{
int d = 0;
int m = a;
while (a)
{
d = s[i] % a;
s[i] = a;
a = d;
}
a = m;
a += s[i];
}
}
cout << a << endl;
}
return 0;
}
代码示例:
#include<iostream>
#include<string>
using namespace std;
const int N = 1e6 + 10;
int s[N];
int a[300] = {0};
int main()
{
string c;
cin >> c;
int flag = 0;
for (int i = 0; i < c.size(); i++)
{
a[c[i]] ++;
}
for (int i = 0; i < c.size(); i++)
{
if (a[c[i]] == 1)
{
cout << c[i] ;
flag = 1;
break;
}
}
if (flag == 0) cout << -1;
return 0;
}
总结
本文总共讲了10题选择题,以及两道牛客编程题,希望大家读后能够有所收获!