【C/C++】刷题笔记day2

188 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

5c3890b9ff3c1c4d11ab82221a08bb78.jpg

自信人生二百年,会当水击三千里!

一、选择题

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

image.png

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、小易的升级之路

image.png

代码分析:

#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;
}

2、找出字符串中第一次只出现一次的字符

image.png

代码示例:

#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题选择题,以及两道牛客编程题,希望大家读后能够有所收获!