考试题型: 不定项选择题 10 道 , 填空题 10 道 , 问答题 2 道 , 编程题 4 道
目录
- [不定项选择题 10 道](#不定项选择题 10 道)
- [填空题 10 道](#填空题 10 道)
- [问答题 2 道](#问答题 2 道)
- [编程题 4 道](#编程题 4 道)
不定项选择题 10 道
```
在TCP协议中,发送方的窗口大小是由两个关键因素共同决定的:
-
接收方允许的窗口(Receiver's Advertised Window):这是接收方通过TCP报文段中的"窗口"字段通知发送方其当前能够接收的数据量。接收方基于自身的缓存空间大小以及数据处理能力来确定这一窗口大小,发送方必须遵守接收方给出的窗口边界,不能发送超过接收方所允许范围的数据。
-
拥塞窗口(Congestion Window, CWND):发送方维护的一个独立于接收方窗口的变量,用于控制在未收到确认之前可以发送的数据量,以应对网络拥塞的情况。当网络发生拥塞时,TCP通过拥塞控制算法动态调整拥塞窗口大小,确保不会过度加载网络,从而减少丢包和重传的概率。
综上所述,在任何时刻,TCP发送方的实际窗口大小等于接收方允许窗口和拥塞窗口这两者中的较小值。即:
发送方窗口大小 = min(接收方允许窗口, 拥塞窗口)
根据给定的代码,我们可以计算出变量z的值。首先,我们计算括号内的表达式:a * b - c,即 5 * 6 - 7,得到的结果是 23。然后我们将这个结果除以变量a,即 23 / 5,得到的结果是 4.6。
但是,由于变量z被声明为整数类型(int),在大多数编程语言中,这意味着结果将被截断为整数,因此变量z的最终值将是 4。
所以,正确答案是 A. 4。
这是一个简单的循环结构,每次循环都将变量y的值翻倍。我们需要找出循环体执行了多少次。
首先,初始化变量y的值为2。然后进入循环,每次循环执行以下操作:
- 第一次循环后,y = 2 + 2 = 4;
- 第二次循环后,y = 4 + 4 = 8;
- 第三次循环后,y = 8 + 8 = 16;
此时,y的值大于8,循环条件不再满足,循环停止。
所以,循环体总共执行了3次。正确答案是A. 3。
在操作系统的进程管理中,进程通常有以下几种基本状态:
- 就绪状态(Ready):进程已经准备好,只要分配到CPU就可以开始执行。
- 运行状态(Running):进程正在CPU上执行。
- 阻塞状态(Blocked/Waiting):进程由于等待某个事件(如I/O完成、信号量、消息等)而无法继续执行。
根据这些状态及其转换规则:
- A. 运行→等待:这是可能发生的,比如进程请求了一个I/O操作或试图获取一个互斥锁但未成功,就会从运行状态转为等待状态。
- B. 运行→就绪:这也是可能发生的,例如正在运行的进程时间片用完,或者更高优先级的进程变为就绪状态时,操作系统会剥夺当前运行进程的CPU使用权,将其从运行状态转为就绪状态。
- C. 等待→就绪:当等待的事件完成时,进程可以从等待状态返回到就绪状态,因此这个转换是可能发生的。
- D. 等待→运行:这是不可能直接发生的,因为一个处于等待状态的进程必须首先变为就绪状态,然后由操作系统调度决定是否能转为运行状态。进程不能直接从等待状态跳转到运行状态。
综上所述,不可能发生的进程状态变化是 D. 等待→运行。
根据栈的性质,元素的出栈顺序必须和入栈顺序满足后进先出的原则。所以,如果入栈序列为ABCDE,那么出栈序列表现为从E到A的某个排列。选项中的DECBA、EDCBA、DCEAB都是可能的输出序列,因为它们都符合后进先出的原则。但是,只有选项C(ABCDE)不符合这个原则,因为它表示的是先进先出,而不是后进先出。因此,答案是C(ABCDE)。
C不会
在这个情境中,每个女巫都有两种选择:要么吃掉姑娘获得美貌,要么保持现状保留魔法能力。由于所有女巫都是聪明理性的,并且知道如果任何一个女巫变成姑娘,她将失去魔法保护从而可能被其他女巫吃掉,因此没有任何一个女巫会选择首先去吃掉姑娘。
在这样的逻辑推理下,每个女巫都会预期其他女巫基于同样的理由不会动手,因此姑娘在这种情况下是安全的,不会被吃掉。这种情况类似于博弈论中的某些模型,比如囚徒困境或公地悲剧的变体,其中个体理性导致集体理性,最终达成一种均衡状态,即没有人采取行动(吃掉姑娘)。
填空题 10 道
问答题 2 道
编程题 4 道
用单链表实现一个栈 (Java)
以下是使用Java实现单链表作为栈的数据结构的示例:
java
public class LinkedListStack<T> {
private static class Node<T> {
T data;
Node<T> next;
public Node(T data) {
this.data = data;
this.next = null;
}
}
private Node<T> top;
public LinkedListStack() {
top = null;
}
// 判断栈是否为空
public boolean isEmpty() {
return top == null;
}
// 入栈操作
public void push(T value) {
Node<T> newNode = new Node<>(value);
newNode.next = top;
top = newNode;
}
// 出栈操作
public T pop() {
if (isEmpty()) {
throw new IllegalStateException("Cannot pop from an empty stack.");
}
T value = top.data;
top = top.next;
return value;
}
// 查看栈顶元素(不移除)
public T peek() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty, cannot peek.");
}
return top.data;
}
}
// 示例用法
public static void main(String[] args) {
LinkedListStack<Integer> stack = new LinkedListStack<>();
stack.push(10);
stack.push(20);
System.out.println("Top element is: " + stack.peek());
stack.pop();
System.out.println("After popping, top element is: " + stack.peek());
}
这段Java代码中,我们创建了一个名为LinkedListStack
的类,它内部定义了一个静态嵌套类Node
用于表示链表节点。栈的顶部由top
变量指向链表的头结点。当进行入栈操作时,新元素作为新的头结点插入;而出栈操作则是移除并返回当前头结点的元素。