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

237 阅读5分钟

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

1634884531827.jpg

如果你有理想的话,就要努力去实现,就这样。

一、选择题

1、队列(a.b.c.d.e)依次入队,允许在其两端进行入队操作,但仅允许在一端进行出队操作,则不可能得到的出队序列是()

A、b, a, c, d, e

B、d, b, a, c, e

C、d, b, c, a, e

D、e, c, b, a, d

答案:B。队列是遵循先进先出的原则, d出队之后,b不可能在c出队之前出队。

2、向一个栈顶指针为h的带头结点的链栈中插入指针s所指的结点时,应执行()

A、h->next=s;

B、s->next=h;

C、s->next=h;h->next=s;

D、s->next=h->next;h->next=s;

答案: D。分析这题向链表的头插, s->next=h;h->next=s

3、若一棵二叉树具有12个度为2的结点,6个度为1的结点,则度为0的结点个数是()

A、16

B、11

C、13

D、不确定

答案:C。分析:总的结点个数 = 1 + 122 + 61 = 31

31 = no + n1 + n2 = n0 + 12 + 6;所以no =13.

4、假设你只有100Mb的内存,需要对1Gb的数据进行排序,最合适的算法是()

A、归并排序

B、插入持序

C、快速排序

D、冒泡排序

答案:A。分析:这题的考点是外排序,因为内存远小于需要排序的数据量,这里只有归并排序是外排序而且时间复杂度是O(n * logn)。

5、

image.png

答案:C。分析:

平衡二叉树,或是一棵空树,或符合以下特性:

【平衡特性1】:左子树的深度和右子树的深度相差不能超过1,可以是0(代表左右子树深度一样)、-1(代表左子树比右子树少一层)、1(代表左子树比右子树多一层) 【平衡特性2】它的左右子树也要是平衡二叉树 。

查找树,或是一棵空树,或满足符合以下特性:

【查找特性1】:若左子树不为空,左子树节点所有的值均要小于根节点;

【查找特性2】: 若右子树不为空,右子树节点所有的值均要大于根节点;

6、关于子进程和父进程的说法,下面哪一个是正确的()

A、子选程被撤销时,其从属的父进程也被撤销

B、一个造程可以没有父进程或子进程

C、父进程被撤销时,其所有子进程也被相应撤消

D、一个父进程可以创建若干个子进程,一个子进程可以从属于若干个父进程

答案:C。 一个父进程可以创建若干个子进程,一个子进程只能属于一个父进程。 父进程被撤销时,其所有子进程也被相应撤消。

7、关于线程和进程,下面说法正确的是()

A、线程提高了不同执行程序间的通信效率

B、进程和线程都是资源分配和调度的基木单位

C、进程切换比同一进程内部的线程切换花费的时间少

D、终止上一个进程比终止一个线程花费的时间少

答案: A。分析: 进程 是资源分配和调度的基木单位,线程不是。 进程切换比同一进程内部的线程切换花费的时间多,因为严格意义上线程是一个小进程。

8、整数Ox12345678,在采用bigendian中内存的排序序列是()

87 65 43 21

21 43 65 87

78 56 34 12

12 34 56 70

答案: C。分析:本题的考点是大端存储。

image.png

9、进程调度时,下列进程状态的变化过程哪一项是不可能发生的()

A、就绪挂起->阻塞挂起

B、阻塞挂起>就绪挂起

C、就绪挂起- →就绪

D、阻塞挂起->阻塞

答案:A。分析:

image.png

10、以下关于多线程的叙述错误的是:

A.线程同步的方法包括使用临界区,互斥量,信号量等

B.两个线程同时对简单类型全局变量进行写操作也需要互斥

C.实现可重入函数时,对自动变量也要用互斥量加以保护

D.可重入函数不可以调用不可重入函数

答案:C。分析:可重入函数可认为是可以被中断的函数,自动变量定义的时候才被创建,函数返回时,系统回收空间。局部作用域变量,不需要互斥量。可重入函数对全局变量才需要互斥量保护。

编程题

1、反转部分单向链表

image.png

代码示例:

list_node * reverse_list(list_node * head, int L, int R)
{
    //////在下面完成代码
    if(head == nullptr || R < L || L < 1)
        return head;
    list_node * p = head;
    list_node * pre = nullptr;//
    list_node * pos = nullptr;
    int len = 0;
    while(p){
        len++;
        pre = (len == L -1 ? p : pre);
        pos = (len == R + 1 ? p : pos);
        p = p->next;
    }
    if(R > len)
        return head;
    list_node *node1 = (pre == nullptr ? head : pre->next);
    list_node *node2 = node1->next;
    node1->next = pos;
    list_node *next = nullptr;
    while(node2 != pos){
        next = node2->next;
        node2->next = node1;
        node1 = node2;
        node2 = next;
    }
    if(pre != nullptr){
        pre->next = node1;
        return head;
    }
    return node1;
}

2、猴子分桃

image.png

分析题意:(1)开始时的总桃子数:X = 5^n - 4

(2)老猴子最后能得到的桃子数:n + (X+4)*(4/5)^n - 4 = n + 4^n - 4

 因为老猴子能得到的桃子主要有两个来源:一是每个小猴子都要给一个,有 n 只小猴子,就可以得到 n 个;二是最后剩余的桃子都归老猴子所有,从上面最后一次的结果来看,一共剩余了 (X+4) * (4/5)^n 个桃子,但是这里面包括我们最早借给它们的 4 个,实际上剩余的桃子数为 (X+4)(4/5)^n - 4 ,所以最后总共能得到的桃子数就是 n + (X+4)(4/5)^n - 4 = 4^n + n - 4。

代码示例:

#include<iostream>
#include<string>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n;

    while (cin >> n && n != 0)
    {
        long long  a, b = 0;
        long long m = n;
        a = (long)pow(5, n) - 4;
        long h = a;
        while (n--)
        {
            a -= 1;
            a = (a / 5) * 4;
        }
        b = a + m;
        cout << h << " " << b << endl;
    }

    return 0;
}

总结

本文总共讲了10题牛客高频的选择题,以及两道牛客编程题,希望大家读后能够有所收获!