【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】
【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】
题目
实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。
编码规则如下:
编码时7位一组,每个字节的低7位用于存储待编码数字的补码 字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节。 采用小端序编码,低位和低字节放在低地址上。 编码结果按16进制数的字符格式输出,小写字母需转换为大写字母
输入描述
- 输入的为一个字符串表示的非负整数
输出描述
- 输出一个字符串,表示整数编码的16进制码流
备注
- 待编码的数字取值范围为[0,1<<64 - 1]
用例
用例一:
输入:
0
输出:
00
用例二:
输入:
100
输出:
64
用例三:
输入:
1000
输出:
E807
说明 1000的二进制表示为0011 1110 1000,至少需要两个字节进行编码;
第一个字节最高位置1,剩余的7位存储数字1000的第一个低7位 (1101000),所以第一个字节的二进制为1110 1000,即E8;
第二个字节最高位置0,剩余的7位存储数字1000的第二个低7位 (0000111),所以第一个字节的二进制为0000 0111,即07;
采用小端序编码,所以低字节E8输出在前,高字节07输出在后。
python解法
- 解题思路:
- 该问题是将一个整数编码为变长的字节序列,其中每个字节的最高位是一个标志位,表示后续字节是否存在。具体来说,使用7位来表示数值,剩余的1位用作标志位来表示是否还有后续字节。每次编码后,若数值还大于等于128(即7位无法完全表示),则需要继续编码。最终返回的结果是这些字节的十六进制表示。
对于每个数值,取低7位作为当前字节的值(通过与0x7F按位与操作获得),然后将这个字节的最高位设为1(通过按位或操作),表示后续还有字节。
当数值变小到小于128时,停止编码,将其直接以十六进制格式返回
def encode_number(num):res = [] # 用于保存每个编码后的字节while num >= 128: # 当数字大于等于128时,需要继续编码# 通过num & 0x7F 获取低7位,0x80表示设置字节的最高位为1res.append(f"{(num & 0x7F) | 0x80:02X}") # 格式化为2位的十六进制数,添加到结果列表num >>= 7 # 将num右移7位,为编码下一段数值做准备# 最后一个字节,直接以低7位表示,无需设置最高位res.append(f"{num:02X}") # 格式化为2位的十六进制数,添加到结果列表return "".join(res) # 将所有字节拼接成一个字符串并返回# 输入整数,进行编码并输出结果
num = int(input()) # 从用户输入读取一个整数
print(encode_number(num)) # 调用encode_number函数进行编码,并打印结果
java解法
- 解题思路
- 该问题是将一个 long 类型的整数编码为变长的字节序列,其中每个字节的最高位是一个标志位,用来表示是否还有后续字节。每个字节的低7位用来表示数值的部分。根据编码规则,处理的过程如下:
每个字节的构成:
对于一个整数,将其分解为多个字节。每个字节表示 7 位数值,最高位(即第8位)用作标志位,表示后续是否还有字节。如果某个字节的最高位是 1,说明后面还有字节。如果是 0,表示这是最后一个字节。
过程:
将整数按 7 位拆分。
对于每个拆分出来的部分,设置其最高位为 1(表示后面还有字节)直到没有更多的数值需要编码。
当数值小于 128 时,设置该字节的最高位为 0,表示这是最后一个字节。
通过按位操作,逐步提取每个字节,并拼接结果。
编码输出:
编码后的结果是一个十六进制的字符串,表示每个字节
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in); // 创建Scanner对象用于读取输入long val = in.nextLong(); // 读取一个long类型的数值Encoder enc = new Encoder(); // 创建Encoder对象System.out.println(enc.encode(val)); // 调用Encoder的encode方法,输出编码结果}
}class Encoder {// 编码方法:将long类型的val编码为变长字节序列public String encode(long val) {StringBuilder sb = new StringBuilder(); // 用于构建编码后的字符串boolean cont = true; // 标志位,表示是否还需要继续编码// 当还需要继续编码时while (cont) {// 获取val的低7位,使用int类型保存,低7位用来表示字节的内容int num = (int) (val & 0x7F);val >>>= 7; // 无符号右移7位,为下一次编码做准备// 如果val还有剩余的数值,则设置当前字节的最高位为1if (val != 0) {num |= 0x80; // 设置最高位为1,表示后续还有字节} else {cont = false; // 如果val已经处理完,停止编码}// 将当前字节num以2位大写十六进制格式添加到StringBuilder中sb.append(String.format("%02X", num));}return sb.toString(); // 返回编码后的十六进制字符串}
}
C++解法
- 解题思路
- 该问题的目标是将一个给定的 long long 类型整数编码成一个变长字节流,每个字节由7位数据和1位标志位组成。具体规则是:
字节格式:每个字节的最低7位用来存储数据,而最高1位用来作为标志位,表示是否还有后续字节。如果最高位为 1,表示还有更多字节;如果为 0,表示没有后续字节。
拆分流程:
将整数转换为二进制字符串。
按照每7位一组将其拆分。
对每一组数据,若不为最后一组,则设置最高位为 1,表示后续还有字节;否则,设置为 0,表示结束。
结果表示:将每个字节转为十六进制字符串,并拼接成最终的编码结果
#include <iostream>
#include <string>
#include <bitset>
#include <sstream>
#include <iomanip>using namespace std;// 将二进制字符串转换为十六进制字符串
string getHexString(const string &binStr) {int hexValue = stoi(binStr, nullptr, 2); // 将二进制字符串转换为十进制整数stringstream ss; // 创建字符串流// 将整数输出为十六进制格式,宽度为2,若不足两位前补零,且使用大写字母ss << hex << uppercase << setw(2) << setfill('0') << hexValue;return ss.str(); // 返回转换后的十六进制字符串
}// 获取结果,将long long类型的num转换为变长编码的十六进制字符串
string getResult(long long num) {// 将num转换为64位的二进制字符串string bin = bitset<64>(num).to_string();// 去掉二进制字符串前面的0,保留有效的二进制部分bin = bin.substr(bin.find('1')); stringstream ans; // 用于保存编码后的十六进制结果int end = bin.length(); // 获取二进制字符串的长度// 按7位一组地处理二进制字符串while (end - 7 > 0) {// 获取当前的7位数据,并在其前面加上1,表示后面还有数据ans << getHexString("1" + bin.substr(end - 7, 7)); end -= 7; // 更新剩余处理的二进制数据长度}// 处理最后不足7位的二进制数据if (end > 0) {ans << getHexString(bin.substr(0, end)); // 最后一个字节无需添加最高位的1}return ans.str(); // 返回编码后的十六进制字符串
}int main() {long long num; // 定义long long类型的输入cin >> num; // 读取输入的数字cout << getResult(num) << endl; // 调用getResult函数并输出结果return 0;
}
C解法
更新中
JS解法
字节构成:
每个字节包含 7 位数据(低7位)和 1 位标志位(最高位)。
若当前字节的标志位为 1,表示后续还有字节需要编码;若为 0,表示当前字节是最后一个字节。
编码过程:
将输入的整数转为 BigInt 类型(处理大整数)。
使用 while 循环按 7 位拆分整数,并为每个字节设置标志位。
将所有字节转换为十六进制,并拼接成最终的结果。
输出:
返回变长编码的十六进制字符串,确保每个字节都以两位十六进制表示(不足两位前补零)
const readline = require("readline"); // 引入 readline 模块用于读取标准输入// 创建 readline 接口
const rl = readline.createInterface({input: process.stdin, // 从标准输入读取output: process.stdout, // 输出到标准输出
});// 监听每一行输入
rl.on("line", (line) => {console.log(encodeNumber(line)); // 每输入一行,调用encodeNumber进行编码并打印输出
});// 编码函数:将输入的数字(字符串形式)编码为变长字节流的十六进制字符串
function encodeNumber(numStr) {let num = BigInt(numStr); // 将输入的字符串转为 BigInt 类型,支持大整数const result = []; // 用于存储每个字节(编码后的字节)// 循环处理每个字节while (num > 0) {let byte = Number(num & 0x7Fn); // 获取 num 的最低7位(即低7位),并将其转换为普通数字num >>= 7n; // 将 num 右移 7 位,准备处理下一部分数据if (num > 0) {byte |= 0x80; // 如果 num 仍然大于 0,说明后续还有字节,设置当前字节的最高位为1}result.push(byte); // 将当前字节加入结果数组}// 处理 num 为 0 的情况if (result.length === 0) {result.push(0); // 如果输入是0,结果数组中应该只有一个字节,值为0}// 将每个字节转换为十六进制字符串,并拼接成最终的结果return result.map(byte => byte.toString(16).padStart(2, '0').toUpperCase()).join("");
}
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
相关文章:
【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】
【华为OD-E卷 - 整数编码 100分(python、java、c、js、c)】 题目 实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。 编码规则如下: 编码时7位一组,每个字节的低7位用于存储待编码数字的补码 字…...
vue3 uniapp封装一个瀑布流组件
新增组件m-waterfall 这样就可以在页面直接使用 不用在引入了 <template><view class"m-waterfall"><view id"m-left-column" class"m-column"><slot name"left" :leftList"leftList"></slot&…...
Android Room 持久化库的介绍及使用方法
Android Room 是 Android Jetpack 组件之一,是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层,允许开发者在 SQLite 数据库上执行常见的 CRUD 操作,同时处理数据库连接、数据迁移和查询优化等底层细节。 Andr…...
Go语言中http.Transport的Keep-Alive配置与性能优化方法
在Go语言中,http.Transport是一个用于发送HTTP或HTTPS请求的客户端工具,它提供了许多可配置的参数以优化性能。其中,Keep-Alive配置是性能优化的关键部分。以下是对http.Transport的Keep-Alive配置与性能优化方法的详细解释: 一、…...
设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
1.策略模式 好处:动态切换算法或行为场景:实现同一功能用到不同的算法时和简单工厂对比:简单工厂是通过参数创建对象,调用同一个方法(实现细节不同);策略模式是上下文切换对象,调用…...
C# 多线程 Task TPL任务并行
先总结一下 之前发展过程的要点 1: 为了保证多线程正确顺序执行 线程同步 2: 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…...
【matlab】matlab知识点及HTTP、TCP通信
1、矩阵运算 点乘:对于两个同维度的向量,点乘结果是这两个向量对应分量的乘积之和。 点除:是指对两个数组的对应元素进行除法运算。 点幂:表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…...
kalilinux - msf和永恒之蓝漏洞
Kali最强渗透工具 - metasploit metasploit是什么? msf是一款开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行的sheelcode,并持续保持更新。 具体操作 1、先切换到root用户,使用msfdb init命令初始化metaspl…...
网络安全测评质量管理与标准解读
大家读完觉得有帮助记得关注和点赞!!! 注意说明 刚开始写过一些比较专业的分享,较多粉丝反应看不懂,本次通过大众的通俗易懂的词汇先了解概念然后再分享规范和详细的技术原理 一、网络安全测评质量管理 网络安全测…...
Cesium根据地图的缩放zoom实现不同级别下geojson行政边界的对应展示
实现效果: 随着地图的缩放,展示对应缩放级别下的行政边界。 准备数据: 1.国家行政边界数据 (country.json) 2.省级行政边界数据 (province.json) 3.市级行政边界数据(city.json&…...
Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】
目录 一.shell命令以及运行原理 二.Linux权限的概念与权限管理 2.1Linux权限的概念 sudo普通用户提权 2.2Linux权限管理 2.2.1文件访问者的分类(人) 2.2.2文件类型和访问权限(事物属性) 2.2.3文件权限值的表示方法 字符…...
深入剖析 Wireshark:网络协议分析的得力工具
在网络技术的广阔领域中,网络协议分析是保障网络正常运行、优化网络性能以及进行网络安全防护的关键环节。而 Wireshark 作为一款开源且功能强大的网络协议分析工具,在网络工程师、安全专家以及网络技术爱好者中广受欢迎。本文将深入介绍 Wireshark 的功…...
【AIGC】SYNCAMMASTER:多视角多像机的视频生成
标题:SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页:https://jianhongbai.github.io/SynCamMaster/ 代码:https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...
PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统
基于深度学习YOLOv5神经网络水果蔬菜检测识别系统,其能识别的水果蔬菜有15种,# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…...
Redisson中红锁(RedLock)的实现
一、什么是红锁 当在单点redis中实现redis锁时,一旦redis服务器宕机,则无法进行锁操作。因此会考虑将redis配置为主从结 构,但在主从结构中,数据复制是异步实现的。假设在主从结构中,master会异步将数据复制到slave中…...
小结:路由器和交换机的指令对比
路由器和交换机的指令有一定的相似性,但也有明显的区别。以下是两者指令的对比和主要差异: 相似之处 基本操作 两者都支持类似的基本管理命令,比如: 进入系统视图:system-view查看当前配置:display current…...
使用yarn命令创建Vue3项目
文章目录 1.技术栈2.创建流程2.1创建vue3项目2.2选择配置项2.3进入项目目录 3.使用Yarn启动项目3.1安装依赖3.2运行项目 1.技术栈 yarnvitevue3 2.创建流程 2.1创建vue3项目 vue create 项目名称2.2选择配置项 直接回车可选择Vue3 2.3进入项目目录 cd 项目名称默认在当前…...
Three.js+Vue3+Vite应用lil-GUI调试开发3D效果(三)
前期文章中我们完成了创建第一个场景、添加轨道控制器的功能,接下来我们继续阐述其他的功能,本篇文章中主要讲述如何应用lil-GUI调试开发3D效果,在开始具体流程和步骤之前,请先查看之前的内容,因为该功能必须在前期内容…...
K8S集群常用命令
1,查看pod kubectl get pods -A 查看所有的pod kubectl get pods 这个只查看namespace为default下的pod,也就是只查看默认命名空间下的pod kubectl get pod -A -o wide 查看所有的pod,并且放出的信息更全(包含了pod的ip࿰…...
【优先算法】滑动窗口--(结合例题讲解解题思路)(C++)
目录 1. 例题1:最大连续1的个数 1.1 解题思路 1.2代码实现 1.3 错误示范如下:我最开始写了一种,但是解答错误,请看,给大家做个参考 2. 将 x 减到 0 的最小操作数 2.1解题思路 2.2代码实现 1. 例题1ÿ…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
