48天笔试训练错题——day41

news2024/11/15 16:02:17

目录

选择题

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

编程题

1. 五子棋

2. Emacs计算器


选择题

1.

当发生拥塞时,TCP 有个机制,会从慢开始进行发送。

1. 把慢开始的门限值设为当前窗口的一半,即 ssthresh = 1/2 * 8 = 4 KB

2. 把拥塞窗口 cwnd 设置为 1 个最大报文段 MSS 大小(1KB)。

3. 再次从慢启动阶段开始。

开始慢启动 cwnd = 1 KB,之后呈指数增长。

经过 1 个 RTT,cwnd = 1 * 2 = 2KB

经过 2 个 RTT,cwnd = 2 * 2 = 4KB,此时达到了门限值 ssthresh,之后进入拥塞避免阶段(线性增长)

经过 3 个 RTT,cwnd = 4 + 1 = 5KB,由于题目说一直没发生超时,cwnd 会一直线性增长到接收窗口大小。

......

经过 8 个 RTT,cwnd = 10KB,因为发送端不能超过接收端的 10KB,此后拥塞窗口一直保持 cwnd = 10KB

发送窗口大小 = min(接收窗口 ,拥塞窗口) = 10KB

2.

子网掩码是 255.255.252.0 (11111111.11111111.11111100.00000000) 网段号为连续的 1,主机号为连续的 0,则有 10 位是主机号。

180.80.77.55(10110100.01010000.01001101.00110111),前 22 位是网段号,因为是发送广播分组,所以求的是广播地址,广播的主机号是全 1,所以 180.80.77.55 所在的广播地址就是 180.80.010011 (10110100.01010000.010011),主机号是 11.11111111,所以广播地址就是 180.80.79.255。

3.

当一台设备知道对方的 IP 地址,不知道对方的 MAC 地址时,启动 ARP,发送 ARP Request 请求广播包到其他主机,收到广播包的主机查看,只有该请求的设备才会单播回答 ARP Reply 响应包(会携带目标主机的 MAC 地址)。所以 ARP 协议本质上是用 IP 地址查询 MAC 地址的协议。

4.

IP 层不对数据部分进行差错校验的原因:

因为网络层是“尽最大努力完整的传输数据包”,差错检测已由数据链路层实现,网络层没必要再进行一次校验。

优点是因为不负责差错检测和纠错,所以可获得较高的传输性能。

而缺点则是因为网络层不负责差错检测,那么错误检测只能在传输层或应用层被发现,使纠错的时间增加了。

5.

除了 TCP 是有连接可靠的协议,其他都是无连接不可靠的协议。

6.

ICMP 控制报文协议,它是 TCP/IP 协议族的一个子协议,用于在 IP 主机,路由器之间传递控制消息。

ICMP 底层协议使用 IP 协议。

7.

三次握手: 

回复 ACK 和 SYN,所以 ACK 和 SYN 都是 1。

由于甲在 SYN 数据报中的序号为 (seq = 11220),所以主机乙给主机甲回复的确认序号是 ack = 11221。

乙发送的 SYN + ACK 数据包的序号 seq 可以从任意位置开始。

8.

网络层提供的是无连接不可靠的数据包服务(IP 协议)。

9.

发送窗口上限值 = min(接收窗口,拥塞窗口) = (2000, 4000) = 2000。

第二次甲给乙发送 MSS = 1000,甲没有收到乙的确认,所以此时甲要把第二个报文段缓存下来,最后能发送 2000 - 1000 = 1000。

10.

一个 IP 的组成部分为:网络号 + 子网号 + 主机号

而原来只有 24 位是网络号,现在子网掩码变成了 255.255.255.248,则发现现在有 29 位是网络号,比原来增加了 5 位,所以最大子网数 = 2^5 = 32,而主机号则有 3 位,就是 2^3 = 8,除去网段号(全0)和广播号(全1) 还剩下 6 个。

编程题

1. 五子棋

这道题不难,就是直接遍历棋盘的每个元素,如果该元素是棋子,那就写一个方法来看看从该元素位置开始,分别计算横向,竖向,对角线,斜对角线的棋子个数,如果其中有棋子个数大于等于 5 个的,则说明该棋盘有五子连珠,输出 Yes,然后返回,如果遍历完棋盘都没有输出 Yes,那就直接输出 No。

代码实现:

// 冗余代码较多版
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            int n = 20;
            char[][] arr = new char[n][n];
            for (int i = 0; i < n; i++) {
                String tmp = in.next();
                arr[i] = tmp.toCharArray();
            }
            print(arr, n);
        }
    }


    public static void print(char[][] arr, int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 如果是棋子,就得看看有没有五子连珠
                if (arr[i][j] != '.') {
                    int count = getCount(arr, i, j, arr[i][j]);
                    if (count >= 5) {
                        System.out.println("Yes");
                        return;
                    }
                }
            }
        }
        System.out.println("No");
    }


    public static int getCount(char[][] arr, int x, int y, char sign) {
        // 往横向,竖向,对角线方向走看看是否五子连珠
        int max = -1;
        int cx = x;
        int cy = y;
        // 横向  x,y - 1
        int count = 1;
        while (cy >= 1 && arr[cx][cy - 1] == sign) {
            count++;
            cy--;
        }
        cy = y;  // x,y + 1
        while (cy + 1 < 20 && arr[cx][cy + 1] == sign) {
            count++;
            cy++;
        }
        if (max < count) {
            max = count;
        }


        cx = x;
        cy = y;
        count = 1;
        // 竖向
        while (cx >= 1 && arr[cx - 1][cy] == sign) {
            count++;
            cx--;
        }
        cx = x;
        while (cx + 1 < 20 && arr[cx + 1][cy] == sign) {
            count++;
            cx++;
        }
        if (max < count) {
            max = count;
        }


        cx = x;
        cy = y;
        count = 1;
        // 对角线
        while (cx >= 1 && cy >= 1 && arr[cx - 1][cy - 1] == sign) {
            count++;
            cx--;
            cy--;
        }
        cx = x;
        cy = y;
        while (cx + 1 < 20 && cy + 1 < 20 && arr[cx + 1][cy + 1] == sign) {
            count++;
            cx++;
            cy++;
        }
        if (max < count) {
            max = count;
        }


        // 斜对角线
        cx = x;
        cy = y;
        count = 1;
        while (cx >= 1 && cy + 1 < 20 && arr[cx - 1][cy + 1] == sign) {
            count++;
            cx--;
            cy++;
        }
        cx = x;
        cy = y;
        while (cx + 1 < 20 && cy >= 1 && arr[cx + 1][cy - 1] == sign) {
            count++;
            cx++;
            cy--;
        }
        if (max < count) {
            max = count;
        }

        return max;
    }

}




// 优化版
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            int n = 20;
            char[][] arr = new char[n][n];
            for (int i = 0; i < n; i++) {
                String tmp = in.next();
                arr[i] = tmp.toCharArray();
            }
            print(arr, n);
        }
    }


    public static void print(char[][] arr, int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 如果是棋子,就得看看有没有五子连珠
                if (arr[i][j] != '.') {
                    int count = getCount(arr, i, j, arr[i][j]);
                    if (count >= 5) {
                        System.out.println("Yes");
                        return;
                    }
                }
            }
        }
        System.out.println("No");
    }


    public static int getCount(char[][] arr, int x, int y, char sign) {
        // 往横向,竖向,对角线方向走看看是否五子连珠
        int max = -1;

        // 横向  (x,y-1)   (x,y+1)
        int count = getTheDirectionCount(arr, x, y, sign, 0, -1) + getTheDirectionCount(arr, x, y, sign, 0, 1) + 1;
        if (max < count) {
            max = count;
        }

        // 竖向 (x-1,y)   (x+1,y)
        count = getTheDirectionCount(arr, x, y, sign, -1, 0) + getTheDirectionCount(arr, x, y, sign, 1, 0) + 1;
        if (max < count) {
            max = count;
        }
        
        // 对角线  (x-1,y-1)   (x+1,y+1)
        count = getTheDirectionCount(arr, x, y, sign, -1, -1) + getTheDirectionCount(arr, x, y, sign, 1, 1) + 1;
        if (max < count) {
            max = count;
        }

        // 斜对角线  (x-1,y+1)  (x+1,y-1)
        count = getTheDirectionCount(arr, x, y, sign, -1, 1) + getTheDirectionCount(arr, x, y, sign, 1, -1) + 1;
        if (max < count) {
            max = count;
        }
        
        return max;
    }
    
    public static int getTheDirectionCount(char[][] arr, int x, int y, char sign, int i, int j) {
        int count = 0;
        while (x + i < 20 && x + i >= 0 && y + j < 20 && y + j >= 0 && arr[x + i][y + j] == sign) {
            count++;
            x += i;
            y += j;
        }
        return count;
    }

}

2. Emacs计算器

思路:计算后缀表达式(逆波兰表达式),我们可以利用栈来实现。遍历字符串,遇到数字就将数字入栈,如果遇到了运算符,那就出栈两次得到两个数字,但是要注意,先出栈的是右操作数,后出栈的是左操作数,顺序不能乱,然后再根据运算符来计算两个数字的结果,再将结果入栈,到了最后,栈里就只有一个数字,输出该数字即可。

代码实现:

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            in.nextLine();
            String str = in.nextLine();
            int ans = emacs(n, str);
            System.out.println(ans);
        }
    }


    public static Integer emacs(int n, String str) {
        Stack<Integer> stack = new Stack<>();
        String option = "+-*/";
        String[] num = str.split(" ");
        for (int i = 0; i < num.length; i++) {
            String s = num[i];
            if (option.contains(s)) {
                // 如果是操作符,则出栈出两次得到 num2 和 num1,
                // 然后计算出结果,再把结果入栈
                int num2 = stack.pop();
                int num1 = stack.pop();
                int ret = 0;
                switch (s) {
                    case "+":
                        ret = num1 + num2;
                        break;
                    case "-":
                        ret = num1 - num2;
                        break;
                    case "*":
                        ret = num1 * num2;
                        break;
                    case "/":
                        ret = num1 / num2;
                        break;
                }
                stack.push(ret);

            } else {
                // 是数字就入栈
                stack.push(Integer.valueOf(s));
            }
        }
        return stack.pop();
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TS】declare 全局声明方式

declare关键字 declare是描述TS文件之外信息的一种机制&#xff0c;它的作用是告诉TS某个类型或变量已经存在&#xff0c;我们可以使用它声明全局变量、函数、类、接口、类型别名、类的属性或方法以及后面会介绍的模块与命名空间。 declare关键字用来告诉编译器&#xff0c;某…

【C语言】关于字符串函数的使用及模拟实现(2)

一、字符串的复制 1.1 库函数strcpy的使用 在函数strcpy中&#xff0c;函数的返回类型为char* &#xff0c;参数部分首先是指向目标地址的指针&#xff0c;其次是指向源地址的指针(由于源地址中内容不受影响&#xff0c;则可以使用const修饰)&#xff0c;函数所需的头文件为st…

51单片机—串口

一、 串口基本认知 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方 式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简 单&a…

#70结构体案例1(导师,学生,成绩)

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <string> using namespace std;#include "random"int get_random_num(int min,int max) {random_device rd;mt19937 gen(rd());uniform_int_distribution<> dis(min,max);int ra…

C语言实现常见O(N^2)的排序算法

目录 1.排序的概念及常见排序算法 1.1排序的概念 1.2常见的排序算法 2.常见O(N^2)排序算法的实现 2.1插入排序 2.1.1基本思想 2.1.2直接插入排序 2.1.2.1直接插入排序的特性 2.1.2.2直接插入排序算法实现 2.2选择排序 2.2.1基本思想 2.2.2直接选择排…

【电脑基础硬件】磁盘阵列

磁盘阵列 一、磁盘阵列概述作用&#xff1a;RAID级别&#xff1a; 二、Raid0Raid1 一、磁盘阵列概述 磁盘阵列&#xff08;Disk Array&#xff09;是一种将多个独立的磁盘驱动器组合起来形成一个逻辑单元的技术&#xff0c;目的是为了提高存储系统的性能、可靠性和可用性。磁盘…

关于儿童编程语言

青少年通常会通过Scratch或Python开始学习编程。在这两种语言中&#xff0c;代码的编写&#xff08;或者在Scratch中是构建&#xff09;方式类似于英语&#xff0c;这使得初学者更容易学习。Scratch的一个重要卖点是对视觉和运动感知学习者非常友好。这些代码块按颜色编码&…

亚信安全获国家信息安全服务(风险评估和安全工程类)二级资质

近日&#xff0c;亚信安全荣获由中国信息安全测评中心颁发的《国家信息安全测评信息安全服务资质证书—风险评估二级》和《国家信息安全测评信息安全服务资质证书—安全工程类二级》资质。亚信安全凭借综合实力和优秀的技术能力&#xff0c;成为为数不多的获得国家信息安全服务…

PXE无人值守

PXE介绍 预启动执行环境&#xff08;Preboot eXecution Environment&#xff0c;PXE&#xff09;也被称为预执行环境&#xff0c;提供了一种使用网络接口&#xff08;Network Interface&#xff09;启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备&#…

支持跨设备操作,自带横向霍尔感应滚轮,雷柏MT760系列鼠标上手

日常工作中&#xff0c;确实很需要一只专为商务办公设计的鼠标&#xff0c;这类鼠标通常会有更低调的外观&#xff0c;同时具备静音按键之类的设计&#xff0c;能够为工作带来更多的方便。我最近上手了雷柏MT760和MT760 Mini。这两款鼠标虽然尺寸不同&#xff0c;但共享了相同的…

12.upload-labs靶场通关详解(11~17)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、Pass11&#xff08;白名单&#xff1a;get00截断&#xff09;2、Pass12&#xff08;白名单&#xff1a;post00截断&#xff09;3、Pass13&#xff08;图片马绕过…

封装组件之使用vue3封装input框并显示联想数据功能

新建Input.vue 定义input框及相关事件 <inputtype"text"v-model"query"input"onInput"blur"hideSuggestions"focus"onInput"/> input输入事件、blur失去焦点、focus获取焦点 //当输入内容时才显示ul内容 const onI…

优化if-else的11种方案

优雅永不过时&#xff01; 1. 使用早返回&#xff08;Early Return&#xff09;&#xff1a;尽可能早地返回&#xff0c;避免嵌套的if-else。 优化前&#xff1a; public class NoEarlyReturnExample {public boolean hasPositiveNumber(int[] numbers) {boolean foundPositi…

自然语言常见面试题及答案(21~40)

Reply&#xff1a;面试题 获取资料下载 文章目录 21. 介绍一下信息抽取在自然语言处理中的重要性和实现方式。22. 谈谈你对预训练语言模型&#xff08;如 BERT、GPT 等&#xff09;的认识和应用经验。23. 简述一下情感分析的流程和方法。24. 对于机器翻译任务&#xff0c;你了…

自旋锁(Spinlock):轻量级锁机制

自旋锁&#xff08;Spinlock&#xff09;&#xff1a;轻量级锁机制 1、什么是自旋锁&#xff1f;2、优势3、局限4、实现与应用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java并发编程中&#xff0c;自旋锁以其独特的非阻塞特性脱颖而…

WordPress原创插件:Category-id-list分类ID显示查看

WordPress原创插件&#xff1a;Category-id-list分类ID显示查看 插件设置位置在工具栏

STL | string C++底层实现

目录 前言 总代码 string结构框架搭建 三个成员 构造 析构 拷贝构造、赋值重载 和 swap size、c_str、operator[ ] string迭代器的简单实现 扩容 reserve insert&#xff08;插入字符和字符串&#xff09; 单字符 字符串 push_back、append、 erase 删除 find查找 …

C++计算字符串中大写、小写、数字、空格、其他字符的个数

#include <iostream> #include <array> using namespace std;int main() {cout << "请输入一个字符串:";string str;getline(cin,str);int daxie0,xiaoxie0,num0,space0,other0;int lenstr.size();for(int i0;i<len;i){if(str[i]>A&&…

Oracle认证1Z0-071线上考试注意事项

目录 一、前言二、回顾过往战绩第一次 裸考&#x1f412;第二次 背题库硬考&#xff01;&#x1f412;第三次 软件卡住&#xff0c;寄&#xff01;&#x1f648;第四次 汇总纠错&#xff0c;通过&#xff01;&#x1f31a; 三、考试流程四、考试注意事项1. 是否需要科学上网2. …

vue(vue2和vue3)项目打包去除console.log

1.Vue2去除 module.exports { configureWebpack: (config) > {// 取消console打印config.optimization.minimizer[0].options.terserOptions.compress.drop_console truereturn {name: "项目名称",resolve: {alias: {"": resolve("src")}}…