开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
如果你有理想的话,就要努力去实现,就这样。
一、选择题
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、
答案: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。分析:本题的考点是大端存储。
9、进程调度时,下列进程状态的变化过程哪一项是不可能发生的()
A、就绪挂起->阻塞挂起
B、阻塞挂起>就绪挂起
C、就绪挂起- →就绪
D、阻塞挂起->阻塞
答案:A。分析:
10、以下关于多线程的叙述错误的是:
A.线程同步的方法包括使用临界区,互斥量,信号量等
B.两个线程同时对简单类型全局变量进行写操作也需要互斥
C.实现可重入函数时,对自动变量也要用互斥量加以保护
D.可重入函数不可以调用不可重入函数
答案:C。分析:可重入函数可认为是可以被中断的函数,自动变量定义的时候才被创建,函数返回时,系统回收空间。局部作用域变量,不需要互斥量。可重入函数对全局变量才需要互斥量保护。
编程题
1、反转部分单向链表
代码示例:
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、猴子分桃
分析题意:(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题牛客高频的选择题,以及两道牛客编程题,希望大家读后能够有所收获!