【大厂机试题解法笔记】报文响应时间

news/2025/6/19 17:54:48

题目

IGMP 协议中,有一个字段称作最大响应时间 (Max Response Time) ,HOST收到查询报文,解折出 MaxResponseTime 字段后,需要在 (0,MaxResponseTime] 时间 (s) 内选取随机时间回应一个响应报文,如果在随机时间内收到一个新的查询报文,则会根据两者时间的大小,选取小的一方刷新回应时间。

最大响应时间有如下计算方式:
当 Max Resp Code < 128, Max Resp Time = Max Resp Code;
当 Max Resp Code ≥ 128,

Max Resp Time = (mant | 0x10) << (exp + 3);
注: exp最大响应时间的高5~7位: mant 为最大响应时间的低4位。

其中接收到的MaxRespCode 最大值为 255,以上出现所有字段均为无符号数。

现在我们认为 HOST收到查询报文时,选取的随机时间必定为最大值,现给出 HOST 收到查询报文个数 C,HOST 收到该报文的时间T,以及查询报文的最大响应时间字段值 M,请计算出HOST 发送响应报文的时间。

输入描述

第一行为查询报文个数 C,后续每行分别为 HOST 收到报文时间 T 及最大响应时间M,以空格分割。

输出描述

HOST发送响应报文的时间。

备注
用例确定只会发送一个响应报文, 不存在计时结束后依然收到查询报文的情况。

用例

输入输出说明
3  
0 20  
1 10  
8 20
11第0秒收到报文,响应时间为20秒(0+20=20)。
第1秒收到新报文,响应时间为1+10=11秒,因11<20,更新最小时间为11秒。
第8秒收到报文,响应时间为8+20=28秒,维持最小时间11秒。
最终结果为11秒

思路

题目核心在考察二进制操作和各进制互转。主要关注 Max Resp Code ≥ 128 时怎么把响应码转成响应时间。mant 是响应码低四位,怎么提取二进制的低四位?提取低四位应该是保留低四位的01状态,把其它位的状态值都置为0,那么与(&)上只有低四位是1其它位是0的二进制数不就保留了第四位,即 mant = code & 0b00001111(0b开头是JavaScript表示二进制字面量的一种写法),为了代码写起来简洁,一般不直接用二进制字面量,0b00001111可以被看成掩码,转成十进制或十六进制不影响二进制运算。JavaScript 把二进制转十进制需先调用变量toString(radix)方法转为字符串,radix是进制,默认是10,再解析为数字。let b = 0b00001111,  decimal = Number(b.toString()) = 15,转为16进制为 hex = toString(16) = 'f',写成十六进制为 0xf 或0x0f,0x0f 是推荐十六进制字面量写法,它包含了前导0,0x0f 能清晰地表示低 4 位为 1111,高 4 位为 0000,即二进制的 00001111。JavaScript 没法通过函数输出数值类型0x0f 或 0xf 形式的十六进制,只能用字符串表示,JavaScript数值表示一般都是十进制。代码里这样写吧:mant = code & 15。接下来提取exp,图片中显示exp位于第5到第7位之间包含边界,八位二进制从右边第一位起计数,索引按1开始。那么提取高5~7位可以用高5~7位的状态位都是1其余位都是0的二进制数0b01110000进行与操作,然后右移动4位把其余位冲掉,为什么要右移呢,根据题意用掩码提取二进制中的某个部分是用它表示一个新数的,低位的0是丢弃的,故要右移把提取的部分挪到最低位。0b01110000对应十进制是112,所以 exp = code & 112,如果嫌十进制表示的112有点大,可以用十六进制0x70。有了 mant 和 exp 就可以根据公式 Max Resp Time = (mant | 0x10) << (exp + 3) 计算最大响应时间了。

参考代码


function solution() {const C = parseInt(readline());const calculateMPT = function(code) {if (code < 128) return code;const mant = code & 15;const exp = code & 112 >> 4;return (mant | 0x10) << (exp + 3);}let result = Infinity;for (let i = 0; i < C; i++) {const [T, M] = readline().split(' ').map(Number);let mT =  calculateMPT(M);result = Math.min(result, T + mT);}console.log(result);
}const cases = [`3
0 20
1 10
8 20`,
`2
0 255
200 60`
];let caseIndex = 0;
let lineIndex = 0;const readline = (function () {let lines = [];return function () {if (lineIndex === 0) {lines = cases[caseIndex].trim().split("\n").map((line) => line.trim());}return lines[lineIndex++];};
})();cases.forEach((_, i) => {caseIndex = i;lineIndex = 0;solution();
});


https://dhexx.cn/news/show-5537656.html

相关文章

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…

删除远程已经不存在但本地仍然存在的Git分支

1. 获取远程分支列表 首先&#xff0c;确保你获取了远程仓库的最新分支信息&#xff1a; git fetch -p -p 参数会自动清理本地仓库中那些在远程已经被删除的分支的引用。 2. 查看本地分支与远程分支的对比 运行以下命令来查看哪些本地分支没有对应的远程分支&#xff1a; …

【使用LLM搭建系统】5 处理输入: 链式 Prompt Chaining Prompts

本章内容主要介绍了将复杂任务拆分为多个子任务&#xff08;链式Prompt&#xff09;的方法及其优势。尽管高级语言模型像GPT - 4擅长一次性遵循复杂指令&#xff0c;但有时拆分任务更可取。通过两个比喻来阐述原因&#xff1a; 一次烹饪复杂菜肴与分阶段烹饪&#xff1a;一次性…

【CANN全新升级】CANN创新MLAPO算子,DeepSeek模型推理效率倍增

MoE模型中的MLA架构 DeepSeek系列模型凭借其创新性的MLA&#xff08;Multi-Head Latent Attention&#xff09;架构&#xff0c;替代了传统的MHA&#xff08;Multi Head Attention&#xff09;&#xff0c;显著降低了推理时的KV Cache开销&#xff0c;大幅提升了推理效率&…

SDC命令详解:使用set_wire_load_model命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定线负载模型名 指定搜索库 指定最大、最小条件 指定对象列表 set_wire_load_model命令用于显式指定一个线负载模型&#xff08;设置了对象的wire_loa…

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…

pymilvus

一.pymilvus介绍 &#x1f680; pymilvus 是什么&#xff1f; pymilvus 是连接和操作 Milvus 向量数据库的 Python SDK&#xff0c;用于处理大规模向量数据的存储、索引和搜索。 &#x1f3d7;️ Milvus 向量数据库 什么是 Milvus&#xff1f; &#x1f50d; 专业向量数据…

C/C++ 面试复习笔记(5)

1.用户态和内核态切换的开销来自哪里&#xff1f;如何减少这种开销&#xff1f; 主要开销&#xff1a; 上下文保存与恢复&#xff1a;需保存/恢复寄存器、堆栈等状态&#xff08;约数百CPU周期&#xff09;。 CPU 模式切换&#xff1a;从用户态到内核态的权限检查及模式切换…

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…

对比一下blender快捷键:p和alt+p

在 Blender 中&#xff0c;P 和 Alt P 虽然看起来相似&#xff0c;但它们作用在不同的上下文&#xff08;Mode&#xff09;下&#xff0c;并完成完全不同的操作&#xff1a; 何时使用哪一个&#xff1f; 想要把模型的一部分从当前网格里拆分出来**&#xff0c;就进入 Edit Mod…