笔试强训48天——day28

一. 单选

1.下面的程序执行输出几个hello?

#include<stdio.h>
#include <unistd.h>
int main( ) {
    
    
fork( );
fork( );
fork( );
printf(“hello\n”);
return 0;
}

A 3
B 4
C 6
D 8

正确答案:D

#include<stdio.h>
#include <unistd.h>
int main() {
    
    
    //假设fork创建子进程都会创建成功
    //该fork之后,会创建出来一个子进程,加上本身的父进程,一共有两个进程
    fork();
    //上面的两个进程都会执行该fork,进而产生两个子进程,加上之前的两个,一共4个进程
    fork();
    //上面的4个进程都会执行该fork,进而产生4个进程,加上之前的4个,一共8个进程
    fork();
    //所以,最终有8个进程会指向下面的语句
    printf(“hello\n”);
    return 0;
}

2. 有一个程序中有A,B,C三个线程同时对一个文件进行读写操作,其中的A,B是写进程只负责往里面写数据,C是读线程,同时把读取的数据从文件中删除,A线程单独写满文件需要10个小时,B单独写程序需要6小时,C线程需要15小时才能读取完整个文件,不考虑三个线程之间的相互影响的情况下现在____小时才能写满文件

A 5
B 6
C 5.5
D 4.5
E 4.8
F 5.3

正确答案:A

数学问题:总任务单位是1,A的写工作效率是1/10,B的写工作效率是1/6,C的读工作效率是1/15
总效率:1/10+1/6-1/15 = 1
时间:1/1/5 = 5

3. 系统中内存不足程序所需大小,程序就无法执行。

A 错
B 对

正确答案:A

操作系统存在虚拟内存,能够把一部分优先级较低的程序保存到系统硬盘

4. 通常所说的"存储保护"的基本含义是()

A 防止存储器硬件受损
B 防止程序在内存丢失
C 防止程序间相互越界访问
D 防止程序被人偷看

正确答案:C

存储保护的含义就是防止程序之间互相越界访问/篡改对方的数据,从而导致对方程序出现问题

5. 下列进程调度算法中,()可能会出现进程长期得不到调度的情况。

A 非强占式静态优先权法
B 强占式静态优先权法
C 时间片轮转调度算法
D 非强占式动态优先权法

正确答案:B

A 非强占式静态优先权法——优先权不变
B 强占式静态优先权法——强占式,高优先权可以抢夺
C 时间片轮转调度算法——循环,公平
D 非强占式动态优先权法——进程一直等待,它的优先权就会动态增长

6. 如果信号量的当前值为-4,则表示系统中在该信号量上有()个进程等待。

A 4
B 3
C 5
D 0

正确答案:A

count值大于0:表示这个信号量是空闲的(资源还可以被使用),进程(线程)可以使用这个信号量
count值等于0:表示信号量被其他进程使用,现在不可以用这个信号量,但PCB等待队列也没有进程在等待
count值小于0:count的绝对值表示有多少个进程(线程)在等待

7. 设两个进程共用一个临界资源的互斥信号量mutex=1,当mutex=-1时表示()

A 一个进程进入了临界区,另一个进程等待
B 没有一个进程进入临界区
C 两个进程都进入临界区
D 两个进程都在等待

正确答案:A

互斥信号量,初始值为1,取值范围{-1,0,1}
当信号量为1时,表示两个进程皆未进入需要互斥的临界区
当信号量为0时,表示有一个进程进入临界区运行,另一个必须等待
当信号量为-1时,表示有一个进程正在临界区运行,另一个进程因等待而阻塞在信号量队列中,需要当前已在临界区运行的进程退出时唤醒

8. 若系统中只有用户级线程,则处理机调度单位是()

A 线程
B 进程
C 程序
D 作业

正确答案:B

如果系统只有用户态线程,则线程对操作系统是不可见的,操作系统只能调度进程;如果系统中有内核态线程,则操作系统可以按线程进行调度;
D选项的作业:作业可以包括多个进程,完成某一个功能,和题意不符合
 

9. 一个在线服务器通常需要读取存储着海量数据的数据库。为了提高服务器处理速度,通常需要加

cache(缓存),以下场景中不适合使用cache的是()

A 数据库中每条数据被访问的概率近似相等,且独立
B 使用了多线程机制的服务
C 单条线程尺寸太小的数据
D 有着大量访问的服务

正确答案:A

基础概念
缓存本质上是将在磁盘的数据提前缓存在内存当中,从而减少程序访问获取数据时的IO操作次数缓存━般会将高频访问的数据,提前读到内存当中缓存起来

解题分析
A选项:访问的概率相等,且独立,就失去了缓存的意义,因为无法区分到底缓存什么数据,能够提高程序的运行效率。除非全部缓存,对标的概念就是内存数据库
B.多线程程序为了减少线程IO的时间,可以把线程使用的数据提前缓存起来,提高程序的运行效率C选项:尺寸较小的数据可以放到缓存当中,因为比较小,不会吃掉缓存的空间。同时缓存之后,也能提高程序的运行效率
D选项:大量的访问的服务想要访问的数据可以缓存下来,减少I0次数,提高程序的运行效率

10. 计算机操作系统的主要功能是( )

A 管理计算机系统的软硬件资源,以充分发挥计算机资源的效率,并为其它软件提供良好的运行环境
B 把高级程序设计语言和汇编语言编写的程序翻译到计算机硬件可以直接执行的目标程序,为用户提供
良好的软件开发环境
C 对各类计算机文件进行有效的管理,并提交计算机硬件高效处理
D 为用户提供方便地操作和使用计算机
正确答案:A

计算机的主要功能:管理计筹机系统的软硬件资源;其中管理=描述〈定义结构体)+组织(将结构体串联起来)

 
 

二. 编程

1. 反转部分单向链表

链接

给定一个单链表,在链表中把第 L 个节点到第 R 个节点这一部分进行反转。

输入描述:
n 表示单链表的长度。
val 表示单链表各个节点的值。
L 表示翻转区间的左端点。
R 表示翻转区间的右端点。
输出描述:
在给定的函数中返回指定链表的头指针。

示例1:
输入
5 1
2 3 4 5
1 3
输出
3 2 1 4 5

正确答案:
思路1:

list_node* ReverseList(list_node* head)
{
    
    
    list_node* prev = nullptr, *cur = head;
    while (cur)
    {
    
    
        list_node* next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    } 
    return prev;
} 

list_node * reverse_list(list_node * head, int L, int R)
{
    
    
    list_node* newHead = new list_node;
    newHead->next = head;
    list_node* prevNode = newHead, *RHead = nullptr, *RTail = nullptr, *TailNext = nullptr;
    for (int i = 0; i < L - 1; i++)
    {
    
    
        prevNode = prevNode->next;
    } 
    RHead = prevNode->next;
    RTail = RHead;
    
    for (int i = 0; i < R - L; i++)
    {
    
    
        RTail = RTail->next;
    } 
    
    TailNext = RTail->next;
    RTail->next = nullptr;
    list_node* RNewHead = ReverseList(RHead);
    prevNode->next = RNewHead;
    RHead->next = TailNext;
    return newHead->next;
}

思路2:

list_node * reverse_list(list_node * head, int L, int R)
{
    
    
    list_node* pHead = new list_node;
    pHead->next = head;
    list_node* prevNode = pHead;
    for (int i = 0; i < L - 1; i++)
    {
    
    
        prevNode = prevNode->next;
    } 
    list_node* cur = prevNode->next;
    for (int i = 0; i < R - L; i++)
    {
    
    
        list_node* nextNode = cur->next;
        cur->next = nextNode->next;
        nextNode->next = prevNode->next;
        prevNode->next = nextNode;
    } 
    list_node* list = pHead->next;
    free(pHead);
    return list;
}

2. 猴子分桃

链接

老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。

输入描述:
输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤20)。
输入以0结束,该行不做处理。
输出描述:
每组测试数据对应一行输出。
包括两个整数a,b。
分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。

示例1:
输入
5 1 0


3121 1025
1 1

正确答案:

#include <iostream>
#include <string>
#include <math.h>
using namespace std;


int main()
{
    
    
    int n;
    while (cin >> n) {
    
    
        if (n == 0) break;
        long total = pow(5, n) - 4;
        long left = pow(4, n) + n - 4;
        cout << total << " " << left << endl;
    } 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Ll_R_lL/article/details/128730469
今日推荐