温馨提示
- 必须熟悉输入输出,Java中是Scanner scan = new Scanner(System.in);(在Java.util包下)
- 必须熟悉各类集合框架,如HashMap、ArrayList等。(在Java.util包下)
- 字符串转数字:Integer.valueOf(字符串);
- 必须熟悉动态规划和DFS+回溯。
- 线上可能通过选择题考察计网、数据结构、计组、操作系统等。
- 本人自做答案,有误请指正!
2021年本科生开放日
计算机网络
1、传统IP地址有ABC三类,下面属于B类的形式的是?
- A类地址:网络号占一个字节,且第一位确定为0,可指派的网络号为1.0.0.0~126.0.0.0,因为网络号全0表示本网络,网络号127保留用作环回测试,如127.0.0.1。
- B类地址:网络号占两个字节,前两位确定为10,尽管这样网络号不会存在全0和全1问题,但128.0.0.0是不指派(谢希仁 教材第7版),因此可指派的网络号为128.1.0.0~191.255.0.0。
- C类地址:网络号占三个字节,前三位确定为110,同样192.0.0.0网络号也是不指派的,因此可指派的网络号为192.0.1.0~223.255.255.0。
注意:主机号也不能全0或全1!
2、TCP连接中,A发送给B大小分别为300、500字节的数据包,已知A的发送序号为200,问:B接受两个数据包后,要通知A已经收到,该信息的序号?
这个300和500字节视为有效载荷,B正确接收到数据包后应回复 ack = 200+300+500 = 1000。
B的确认包:B收到packetA,向A发送确认包packetB(seq=packetA.ack,ack=packetA.seq+packetA.有效载荷)
3、以太网,传输速率100Mbps,信号传播速度200000km/s,如果最小数据帧的长度增大90bits,则
(1)电缆的最大长度能够增加多少?(2)信道利用率是上升还是下降?
数据链路层是学习时容易遗漏的部分,需要以下知识:
以太网MAC帧的最小帧长度为 64 bit;100M以太网的最大电缆长度为100米。
a = τ / T0 ,其中 τ 是单程端到端时延,T0是帧的发送时间,等于帧长与发送速率之比。
极限信道利用率为Smax = 1 / (1 + a),a需要远小于1才能达到较高的极限信道利用率。
(1)a = (τ × 发送速率) / 帧长 = (电缆长度 × 发送速率) / (传播速度 × 帧长),为保持a不变,帧长由64bit变为154bit,电缆长度由100米变为240.625米。
(2)帧长变大,a变小,信道利用率上升。
数据结构
1、归并排序
例如二路归并排序,可采取递归的方式,用递归做分治,然后排序后归并。
2、给定一张图,通过某种遍历方法,得到一个生成树,问采用了哪种遍历方法?
图的遍历,一种是深度优先遍历,一种是广度优先遍历。
3、m叉树,度为Ni的结点有i个(i=1,2,…m),问度为0的结点有多少个?
4、n个元素的散列表查找的复杂度是多少?(理想情况)
4、入栈顺序为:1 2 3 4 … n;出栈顺序为:p1 p2 p3 p4 … pn,如果p1=n,则pi=?
5、二叉树有n个结点,查找一个元素最坏的复杂度?
6、AOV中求解拓扑排序,分为abc三个步骤。a. 把???为0的结点都入栈。 b. 如果栈非空, pop栈顶元素Vj,查看它的直接后继Vk,删除Vk的出边,然后重新统计???为0的结点,继续入栈。 c. 重复上述过程。
AOV网:一种以顶点表示活动,以边表示活动的先后次序且没有回路的有向图(有向无环图)。
???处填写 入度,即入度为0的结点入栈。
入度为0表示没有前驱结点。
7、希尔排序,增量一次为3,2,1,问前两次排完后的结果。
希尔排序是一种分组插入排序。
增量初始值一般取为数组长度的一半(向上取整),当增量为1时排序结束。
操作系统
1、C标准库函数中,哪个函数不借助任何系统调用? 选项是:A. malloc B. printf C. time D. strtime
D. strtime
2、x86-64架构中,32位虚拟地址空间,4kB页面大小,采用的页表级数是几?
4KB = 212 bit
32 - 12 = 20,因此共有220个页。
页表项是不可分割的,20 ÷ 12 = 1余8,采用两级页表合适。
3、整数除零后会发送什么信号? 有选项是:SIGILL、SIGFPE
SIGFPE:floating-point exception,浮点异常,包括浮点运算出错、溢出和除数为0等。
Linux中的其它SIGNAL信号
SIGILL:illegal instruction 非法指令
SIGHUP:hang up 挂断
SIGBUS:非法地址,包括内存地址对齐出错。
SIGTRAP:由断点指令或其他trap指令产生。
SIGPIPE:管道破裂。
SIGSEGV:试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.。
4、Linux…ELF在gdb执行start后,第一条指令位于? 有选项是:ELF指向的入口地址
计算机组成原理
1、流水线结构中,branch指令发生跳转,需要插入多少个空操作(bubble)或者阻塞多少个周期?
我觉得要分情况,是几级流水线结构。
2、交通卡上显示余额42949672.76元,显示错误,问实际最有可能是多少?
卡内余额是一个 int 型整数,4字节,32比特,即232 = 4294967296。
若以无符号数考虑,其值为0 ~ 4294967296,余额范围0 ~ 42949672.96。
若以有符号数考虑,其值为-2147483648 ~ 2147483648。
最小单位考虑到分,则有符号数表示余额范围:-21474836.48 ~ 21474836.48。
4294967276 = 0xFFFF FFEC,因为负数在存储时采用补码形式,恢复其原码:
0xEC = 0b1110 1100,首先减1 = 0b1110 1011,然后取反 = 0b1001 0100 = -20(十进制),最高位符号位还是1,表示负数。
所以应是-20,然后还要考虑元角分,因此是-0.2元。
3、CPU访问内存,以下哪种不可能发生?其中CD选项为:C. TLB(快表)命中,但发生缺页。 D. cache没有命中,但没有发生缺页。
C,快表命中,页肯定命中,不可能发生缺页。
4、主存地址线32位,按字节编址。cache块大小64Byte,cache的数据容量是64Kbyte,cache采用写回,cache和主存采取直接映射,问cache容量多大?
5、指令取到指令寄存器开始后,POP X2; DIV X2,X1; AND X1,X2; MOV X1 0(X2),这四种哪一个不会发生异常?
2019年本科生开放日
题1:
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
思路:
我们选取的贪心策略为,每一步总是选择一个使剩下的数最小的数字删去。
即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。
然后回到串首,按上述规则再删除下一个数字。重复以上过程k次,剩下的数字串便是问题的解了。
package summerCamp.NJU;
import java.util.ArrayList;
import java.util.Scanner;
/**
* 题目见 https://blog.csdn.net/Shaft_/article/details/96226294
*/
public class NJU_2019_01 {
public static void main(String[] ags){
Scanner scanner = new Scanner(System.in);
System.out.println("输入数据");
Long n = scanner.nextLong(); // 输入的数据
String data = n.toString(); // 转为字符串
int len = data.length();
ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < len; i++) {
list.add(data.charAt(i));
}
System.out.println("要删除的位数为");
int m = scanner.nextInt(); // 读入要删除的位数
while(m > 0) {
for (int i = 0 ; i < list.size() - 1; i++){
if (list.get(i) > list.get(i + 1)) {
list.remove(i);
m--;
break;
}
if (list.get(i) < list.get(i + 1) && i == list.size() - 2) {
list.remove(i + 1);
m--;
break;
}
}
}
System.out.println(list);
}
}